前言·

将《Python黑帽子:黑客与渗透测试编程之道(第2版)》

更加偏向网络层面或Web层面的渗透测试:

《Python黑帽子:黑客与渗透测试编程之道(第2版)》是畅销书《Python黑帽子:黑客与渗透测试编程之道》的再版,介绍Python是如何被运用在黑客和渗透测试的各个领域的:从基本的网络扫描到数据包捕获,从Web爬虫到编写Burp插件,从编写木马到权限提升等。书中的很多实例都很有启发意义,比如HTTP通信数据中的人脸图像检测,基于GitHub进行C&C通信的模块化木马,浏览器的中间人攻击,利用COM组件自动化技术窃取数据,通过进程监视和代码插入进行提权,通过向虚拟机内存快照插入shellcode实现木马驻留和权限提升等。学习这些实例,读者不仅能掌握各种Python库的应用和编程技术,还能拓宽视野,培养和锻炼自己的黑客思维。阅读本书时,几乎感受不到一般技术图书常有的枯燥和乏味。

姊妹篇:

0 前言·

好多大佬推荐,而且第二版相对来说也比较新,感觉值得精读+实操

1 安装配置·

配置Kali:·

自己使用的是wsl+Kali(kex),apt总是出现问题,这种环境配置类的问题,大概是参考的博客比较旧了

大家在安装好Kail Linux系统之后为了更快更稳定地更新系统都会选择换国内的源,但是我在网上查找资料的时候发现大部分教程都停留在2021年以及之前,这给学习带来了很大的困难,通过这篇博客我们将一起探讨解决Kali Linux换国内源后更新失败的问题。

解决Kali Linux换国内源后更新失败的问题(2023版) - 知乎 (zhihu.com)

安装中文输入法:Kali 安装中文输入法(超详细)_kali安装中文输入法教程-CSDN博客

1
2
3
apt install fcitx#输入法框架
apt-get install fcitx-googlepinyin#Google pinyin
#重启,fcitx设置中找到加入Google pinyin;并设置偏好

恢复fcitx的热键设置为empty

edit ~/.config/fcitx/config TriggerKey=CTRL_SHIFT_LSHIFT EMPTY

wsl kali 关机

使用正确的命令重启WSL子系统_wsl 重启-CSDN博客

wsl -l -v查看wsl实例发行版的名称及状态。

wsl -t kali-linux 关机kali,可能是因为自己log out时保存session 的缘故,没有关机

Python虚拟环境和VScode安装·

Python虚拟环境:

1
2
3
4
5
sudo apt install python3-venv #下载venv软件包
mkdir bhp & cd bhp #设置虚拟环境所在的工作目录
python3 -m venv venv3 #创建
source venv3/bin/activate #激活虚拟环境
deactivate #退出虚拟环境

官网下载deb版本的VScode -->dpkg -i XXX.deb

VScode按照推荐下载Python扩展–>右下角解释器识别到venv 的python环境并使用

dpkg即 package manager for Debian ,是 Debian 和基于 Debian 的系统中一个主要的**包管理工具**,可以用来安装、构建、卸载、管理deb` 格式的软件包。

apt之所以不能直接安装本地deb包,是因为它需要从软件仓库中下载包的依赖关系。当您使用apt install命令时,apt会首先检查软件仓库中是否有要安装的包的最新版本。如果找到,apt会下载该包及其所有依赖关系,然后使用dpkg安装它们。

无论是环境配置还是敲代码,只要实践过一两次,之后就懂了,很轻松;没有想象的难

2 基础的网络编程工具·

网络对于黑客而言永远是最重要的竞技场。 攻击者总是想方设法通过简单的网络访问做成几乎任何事情,比如扫 描主机、注入数据包、嗅探数据、远程攻击主机等等。但是,闯入某 个目标企业内网的深处后,你可能并不能为所欲为:执行网络攻击离 不开必要的工具。这里没有netcat,没有Wireshark,没有编译器,甚至 没有办法去安装编译器。然而有很多时候,黑客可能会惊讶地发现目 标环境里安装了Python。此时,Python就是开路利器。

socket

本地的client和本地的server连接(TCP):

client:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import socket

target_host = "127.0.0.1"
target_port = 9998

#create a socket obeject
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# connect the client
client.connect((target_host,target_port))

#send data1
client.send(b"hello")
#client.send(b"GET / HTTP1.1\r\nHost: google.com\r\n\r\n")

#receive data
response = client.recv(150)

print(response.decode())
client.close()

server:

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
import socket
import threading

IP = '0.0.0.0'
PORT = 9998

def main():
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind((IP,PORT))
server.listen(5)
print(f'[*] Listening on {IP}:{PORT}')

while True:
client,address = server.accept()
print(f'[*] Accepted connection from {address[0]}:{address[1]}')
client_handler = threading.Thread(target=handle_client,args=(client,))
client_handler.start()

def handle_client(client_socket):
with client_socket as sock:
request = sock.recv(1024)
print(f'[*] Received: {request.decode("utf-8")}')
sock.send(b'ACK')

if __name__ == '__main__':
main()

自己使用Google 不显示,换成baidu等国内的,出现400报错,解析HTTP错误码400 Bad Request及其常见原因与解决方法_http status 400 – bad request-CSDN博客

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌──(kali㉿LAPTOP-4MGSMUU8)-[~/bhp]
└─$ python3 socket_client.py
HTTP/1.1 400 Bad Request
Date: Mon, 29 Apr 2024 16:20:43 GMT
Content-Type: text/html
Content-Length: 150
Connection: close
Server: dae

<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>

https://blog.csdn.net/qq_40549070/article/details/108193537

4 Scapy·

Scapy pip 失败,【Python】解决 pip 开了网络代理之后无法安装包的问题_无法pip安装包-CSDN博客

mail_sniffer.py:

1
2
3
4
5
6
7
8
9
from scapy.all import sniff
def packet_callback(packet):
print(packet.show())

def main():
sniff(prn=packet_callback,count=1)

if __name__=='__main__':
main()
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import argparse
import socket
import shlex
import subprocess
import sys
import textwrap
import threading

def execute(cmd):
cmd = cmd.strip()
if not cmd:
return
output = subprocess.check_output(shlex,split(cmd),
stderr=subprocess.STDOUT)
return output.decode()

class NetCat:
def __init__(self,args,buffer=None):
self.args=args
self.buffer=buffer
self.socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

def run(self):
if self.args.listen:
self.listen()
else:
self.send()

if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='BHP Net Tool --- By Han',
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog=textwrap.dedent('''
netcat.py -t 192.168.1.108 -p 5555 -l -c
netcat.py -t 192.168.1.108 -p 5555 -l -u=mytest.txt #upload to file
netcat.py -t 192.168.1.108 -p 5555 -l -e=\"cat /etc/passwd\" #execute commnad
echo 'ABC' | ./netcat.py -t 192.168.1.108 -p 135 #echo text to server port 135
netcat.py -t 192.168.1.108 -p 5555 #connect to server
'''

)
)
parser.add_argument('-c','--command',action='store_true',help='command shell')
parser.add_argument('-e','--execute',help='execute specified command')
parser.add_argument('-l','--listen',action='store_true',help='listen')
parser.add_argument('-p','--port',type=int,default=5555,help='specified port')
parser.add_argument('-t','--target',default='192.168.',help='specified IP')
parser.add_argument('-u','--upload',help='upload a file')
args =parser.parse_args()
if args.listen:
buffer=''
else:
buffer=sys.stdin.read()

nc = NetCat(args,buffer.encode())
nc.run()