我前段时间注意到,curl
作为命令行参数提供的用户名和密码不会出现在ps
输出中(尽管它们可能会出现在您的bash历史记录中)。
他们同样不会出现在中/proc/PID/cmdline
。
(不过,可以导出用户名/密码组合参数的长度。)
演示如下:
[root@localhost ~]# nc -l 80 &
[1] 3342
[root@localhost ~]# curl -u iamsam:samiam localhost &
[2] 3343
[root@localhost ~]# GET / HTTP/1.1
Authorization: Basic aWFtc2FtOnNhbWlhbQ==
User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Host: localhost
Accept: */*
[1]+ Stopped nc -l 80
[root@localhost ~]# jobs
[1]+ Stopped nc -l 80
[2]- Running curl -u iamsam:samiam localhost &
[root@localhost ~]# ps -ef | grep curl
root 3343 3258 0 22:37 pts/1 00:00:00 curl -u localhost
root 3347 3258 0 22:38 pts/1 00:00:00 grep curl
[root@localhost ~]# od -xa /proc/3343/cmdline
0000000 7563 6c72 2d00 0075 2020 2020 2020 2020
c u r l nul - u nul sp sp sp sp sp sp sp sp
0000020 2020 2020 0020 6f6c 6163 686c 736f 0074
sp sp sp sp sp nul l o c a l h o s t nul
0000040
[root@localhost ~]#
如何达到这种效果? 它在的源代码中curl
吗?(我假设它是一个curl
功能,而不是ps
功能?还是某种内核功能?)
另外:这可以从二进制可执行文件的源代码之外实现吗? 例如,通过使用shell命令,可能结合了root权限?
换句话说,我能以某种方式掩盖传递给任意 shell命令的输出中/proc
或ps
输出中的参数(我想是一样)吗?(我想对此的答案是“否”,但似乎值得将这个额外的半个问题包括在内。)
environ
直接使用访问环境变量?—最重要的是:参数列表与环境变量列表一样,位于读/写用户进程内存中,并且可以由用户进程修改。
grep
模式的第一个字符设为字符类。EGps -ef | grep '[c]url'
curl
匹配curl
但[c]url
不匹配[c]url
。如果您需要更多细节,请提出一个新问题,我很乐意回答。