Đâ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.