将《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
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect((target_host,target_port))
client.send(b"hello")
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()
|