1 缘由
千辛万苦拿下的 webshell 不是 www-data 用户就是 networkservice 权限,要想拓展攻击面、扩大战果,提权,是必经之路,也是后渗透阶段成功的关键。windows 提权,常用手法包括搜寻本地明文密码、DB 命令执行提权、内核 exp 提权、dll 劫持提权、路径未带引号的服务提权、滥用高权 token 提权、三方软件提权,每种手法有各自的使用门槛及适用场景,通常需要多种措施并举,才能拿下目标。
其中,若能在目标上搜寻到密码,后续有几种利用方式:一是,可能为操作系统的密码,尝试登录系统账号,获取管理员的远程会话,如,RDP、telnet 等等;二是,可能为系统软件的密码,且这类软件内部具有命令执行模块,间接获得高权执行命令的能力,如,MSSQLServer、FTP 等等;三是,可能为远程管理软件的密码,从这类软件的客户端登录目标,获取管理员的远程控制权限,如,VNC、teamviewer 等等。但是,即便找到第二、三种方式的密码,对于稍微有运维经验的系统管理员来说,都可以轻松阻拦你的提权企图,比如,对 MSSQLServer 的 xp_cmdshell 模块降权,或,设置 VNC 的信任源 IP。相对而言,第一种方式,一旦找到密码,几乎没有门槛即可成功提权。
现在,我把焦点放在如何找出操作系统账号的密码上面。通常来说,我会先翻阅各类软件的配置文件,找到其中记录的明文密码,如,保存无人值守安装操作的密码文件(autounattend.xml)、保存 web 连接 DB 的密码文件(web.config);然后,用这些密码尝试登录 administrator 账号的远程桌面,若运气好,简单几步,已实现提权;最后,若无果,用这些密码尝试登录 administrators 群组内其他账号的远程桌面。这个流程中有三个问题,一是若目标未将 3389 暴露至公网将导致无法验证密码是否正确,二是用多个密码验证多个账号太过耗时,三是也想尝试常见弱口令却缺乏自动手段。
那么,我需要一个效率高、无依赖、体积小的本地账号密码暴破工具。嗯,win32 原生程序直接在目标机器上本地暴破所有操作系统账号,就它。这个工具要能帮我找到 are you admin? 的答案,所以,命名为 ruadmin:
2 实现
你知道,我移居 linux 多年,win32 忘得差不多了,所以,我找 MSDN 帮忙,花了两个晚上,基本上,我付予了 ruadmin 几个核心能力:高效精准验证账号密码、自动获取 OS 账号、内置高命中率弱口令、绿色无依赖不查杀、兼容 NT 架构的全版本系统。
高效验证账号密码。调用 LogonUser(),不通过任何网络协议,直接本地验证:
甚至能验证空密码的账号。另外,一个账号对应一个暴破线程,进一步提高效率:
自动获取操作系统用户名。调用 NetUserEnum() 获取包括隐藏账号(如 yangyangwithgnu$)在内的所有用户名:
其中,默认不暴破 guest。
内置高命中率基础弱口令字典。 我把常见弱口令字典集成进 ruadmin,包含中国人弱口令、外国人弱口令、黑客常用口令等近 4W 条:
自动生成社工密码字典。从经验来看,若常见弱口令暴不出来,十有八九管理员使用了与环境相关的字符作为密码,最常见的是,以社工关键字(的大小写组合)、特殊字符、基础弱口令等三部分组合而成的字符串作为密码。比如,某网站的域名为 foo.com,其中 foo 为关键字,administrator 的密码为 Foo@2017;又如,某主机名为 bar-web,其中 bar 为关键字,administrator 的密码为 BAR-8888;再如,administrators 群组内的一账号名为 admin_liucc,其中 liucc 为关键字,admin_liucc 的密码为 LiucC1qaz2wsx。为增加暴破成功率,我为 ruadmin 实现了自动生成这类模式的社工密码字典的功能。
社工关键字的所有大小写组合。以 abcd 为例,在各字母位置不变的情况下,大小写排列组合有 abcd、abcD、abCd、abCD、…、ABCD 共计 16 个。再一分析,每位有大写、小写两种可能,这与二进制非常类似。所以,我将字符串映射成相同位数的二进制,对应位若为 1 则应大写、否则小写。比如,字符串 abcd 有 2 ** 4 = 16 种大小写组合:0 – 0b0000 – abcd、1 – 0b0001 – abcD、2 – 0b0010 – abCd、3 – 0b0011 – abCD、4 – 0b0100 – aDcd、5 – 0b0101 – aBcD、…、15 – 0b1111 – ABCD。基于此算法,实现起来就容易了:
若字符串中的某些字符非字母,将导致生成重复项,所以采用 set 容器以自动剔重。
社工关键字的常见大小写组合。管理员采用社工属性的密码,目的肯定是方便记忆,对于 aBCdEf 这类大小写组合完全记不住,所以,并不需要将所有大小写排列组合都纳入密码字典中,经验来看,有八种非常好记:全小写(abcdef)、全大写(ABCDEF)、第一个小写其余大写(aBCDEF)、最后一个小写其余大写(ABCDEf)、第一个大写其余小写(Abcdef)、最后一个大写其余小写(abcdeF)、两头小写中间大写(aBCDEf)、两头大写中间小写(AbcdeF)。实现如下:
这是 ruadmin 当前选用的方式,如果原意,你可以调整代码,选用全量大小写排列组合。
特殊字符。键盘上能直接输入的特殊字符包括
共 31 个,为了不让生成的社工字典过余庞大,我只选用了其中最常见的 18 个,外加空格和空字符共计 20 个:
为什么不用一个字符串字面常量表示所有特殊字符?空字符。
生成社工字典。有了社工关键字(8 种常见大小写排列组合)、特殊字符(20 个常用)、基础弱口令字典(内置 4w),大概计算下生成的社工字典记录约 8 * 20 * 40,000 = 6,400,000,虽然不会超过 vector 的容量上限(max_size()),但也是不小的内存消耗,所以,我以时间换空间,在暴破密码时动态生成社工密码项:
另外,只用社工关键字作为密码项、只用基础弱口令作为密码项、只用社工关键字加基础弱口令(无特殊字符)作为密码项等三种需求也已函盖,其实每个增加空项即可:
其他。纯 win32 实现,无任何依赖;体积小,方便上传;没用恶意代码,不会触发 AV 报警;平台无关,x64 和 x86 都能运行;同时,在生成可执行文件时,我将 VS 工程设置为 project – properties – configuration properties – general – general – platform toolset – vs2015 – windows xp (v140_xp),这样,ruadmin 就能支持客户端系统 winXP~win10、服务端系统 server2003~server2016。
3 使用
即便默认参数,ruadmin 也能为你做很多事了:
你看,它自动帮你找出所有用户,甚至,剔掉了无用的 guest、加上了隐藏账号 homegroupuser$;另外,内置 4w 常见弱口令。在不给任何命令行参数情况下,1 分钟左右,暴破完毕,得到 3 个账号的密码:test1/000111222 使用常见弱口令、test0/test0 将用户名作为密码、administrator 为空密码。
如果觉得没必要暴破所有账号,只要暴破出一个即可,那么,可指定 –one-quit:
内置弱口令字典不够强悍,你可以用 –base-passwds-file 加载自己独家典藏的字典:
效果不错,又找暴出一个密码 yang/LOVE5201314。
单纯的常见弱口令字典还不够,无法暴破出其他账号,我得制作一个与目标环境相关的规则密码字典,然后用 –base-passwds-file 指定使用。规则密码字典生成工具,我推荐 hashcat、crunch,现以前者为例。对,hashcat 不仅是哈希暴破神器,也支持基于规则生成密码字典,规则库位于 hashcat/rules:
其中,dive.rule 内含规则最为丰富,选之。翻阅目标环境上的配置文件,找到个密码 h.t.j.d,与用户名 htjd 很对应,试过无果后,我将 h.t.j.d 视为基础信息存入 base.txt 中作为输入,让 dive.rule 模仿学习生成类似的规则密码字典,保存至 passwds.txt:
然后用 –user 指定暴破账号 htjd,并使用刚生成的规则密码字典 passwds.txt:
很快暴出密码 h/t.j.d!。
ruadmin 也具备一定社工字典生成能力。前面提过,大部份管理员习惯以社工关键字(的大小写组合)、特殊字符、基础弱口令等三部分组合而成的字符串作为密码。你把社工关键字 annil 放入 se.txt 中,结合一个外部小弱口令字典,尝试暴破 annil:
哇哦,这密码够长,且含大小写、特殊字符、数字,这么复杂都能暴出来,挺好,呵呵。不知道你注意到没,仅指定一个社工关键字、使用 1k 左右的基础小字典,通过 ruadmin 生成的社工字典居然达到 20w 左右,完全是级数暴增。所以,一旦使用 –se-keywords-file,我建议基础字典尽可能精简,否则暴破时间将非常长。
4 攻击
不要纸上谈兵,看我如何用 ruadmin 实现提权。
不论是命令注入、任意文件上传、代码执行,总之假设通过各种手段已经获得据点(webshell)。
上传 ruadmin。有 webshell,上传文件易如反掌,但我们上传的不是一般文件,而是可执行程序,得尽可能为程序运行铺平道路。从经验来看,有两点建议:一是上传目录方面,程序运行时可能生成临时文件,所以上传的目录最好具有读写权限,如 C:\Windows\Temp\ 或 %temp% 是个选择;二是文件名方面,应考虑到 AV 的反应,基础名不要用 exp、agent、xxxx、info、hack、admin 等等这类带有明显攻击性的字样,可以随机化(如,用 amneo 就不错),扩展名方面,先在攻击端将其改为 txt,上传成功后再改回 exe,甚至,若目标环境禁止改名,采用未关联任何打开程序的扩展名(如,*.128),windows 允许在命令行中直接运行 *.128 这样的文件(这两条建议在你上传 exp 时也适用)。具体而言,我将 ruadmin.exe 改为 amneo.128,进入 webshell 的 File Manager 模块,上传目录定为 C:\Windows\Temp\,选择攻击端文件 amneo.128 上传:
采用内置密码暴破。进入 webshell 的 cmdShell 模块,不带任何命令行选项直接运行 amneo.128:
ruadmin 默认选项,采用 39526 个字典项暴破自动获取的 8 个操作系统账号,半分钟后,显示未找到任何密码。
采用 web.config 中的密码暴破。显然,内置字典无效,前面分析过 web.config 中含有多个 DB 的密码:victim@2014、victim、victim2015、sf0618@sf0618、xtepxscm,我将其写入目标上的 p0.txt 中,指定使用 p0.txt 作为密码字典文件,运行后仍然无果:
采用规则密码暴破。我得根据该目标的属性,重新制作一个社工字典。简单分析发现,该网站域名含有 victim,而 DB 的密码出现过 victim@2014、victim2015,那么,我可以合理猜测管理员密码由 victim、特殊字符、年份等三部分组成,但是 victim 分大小写、特殊字符十来个、年份也不确定,排列组合结果太多,必须找个工具基于规则自动生成。前面介绍过 hashcat,我把 victim@2014、victim、victim2015 视为基础信息存入 base.txt 中作为输入,让 dive.rule 模仿学习生成类似的密码字典,保存至 passwds.txt。生成的字典有 26w 条,目标上有 8 个账号,也就要枚举 268446 × 8 次,短时间肯定跑不出来,在 webshell 中执行耗时较长的命令时,页面将报超时错误,无法正常显示程序运行结果,所以,将命令执行结果重定向到文本中:
大概十分钟之后 foo.txt 体积达到 1k 左右,说明命令执行完成,查看 foo.txt:
成功暴破出两个管理员账号的密码。
以管理员身份登录远程桌面,实现提权。端口转发大概有三步,先在自己的 VPS 上建立端口对应,再在攻击端连接 VPS 上的转发端口,最后在 webshell 上转发。具体而言:第一步,用 sSocks(https://sourceforge.net/projects/ssocks/)在 VPS 上建立 3388 与 3389 端口对应关系,实现流量互通:
第二步,从攻击端连接 VPS 的 3388 端口,第一次尝试 administrator/victim@2014。建议用 freerdp 而非 rdesktop,前者支持连接等待、文本复制粘贴、挂载远程文件系统:
第三步,立即在大马上执行端口转发,可能需要连续多次点击 start:
注意,整个过程对步骤先后顺序敏感,VPS 上 rcsocks 端口映射好以后就可以不管了,先在攻击端执行 xfreerdp,让其会话保持,再在 webshell 上转发内网的 3389。
组合使用目标上的 webshell、VPS 上的 rcsocks、攻击端上的 xfreerdp 将内网的 RDP 端口转发至公网后,输入 administrator/Victim@2017 成功登录目标:
某些环境限定了 RDP 源 IP,即便做了端口转发也无法登录。没关系,既然我有管理员的密码,那么只要找到类似 linux 上的 su 命令,以管理员身份执行命令。windows 上的 runas 就具备这个能力,但它没法将密码填入命令行参数中,所以,用支持在命令行参数中输入密码的开源版本 cpau(http://www.joeware.net/freetools/tools/cpau/)替代。具体要执行什么命令?根据各人喜好,我会直接反弹一个管理员权限的 meterpreter。运行 cpau:
其中,我将 cpau.exe 重命名为 asdf.64,tybdf.16 为 msfVENOM 生成的反弹 payload。很快将获得管理员的 meterpreter:
5 FQA
Q:暴破还能用于提权?没听过呢,朋友。
A:从近期把 ruadmin 投入实战中的效果来看,成绩喜人!针对提权,大部份攻击者也就会 DB 命令执行、内核 exp 这两招,稍微有一定道行的会翻下存放明文密码的文件、找下存在配置缺陷的服务,再高端点的会盗用特权 token、攻击万能钥匙,而低门槛的本地暴破,却很少被纳入“正统”提权手法名录中,究其原因,大概有三:一是,完全没这个意识,最多用 hydra 远程暴破下 RDP;二是,有这个意识,但缺乏类似 ruadmin 这类不依赖任何协议的本地暴破工具;三是,暴破乃是脚本小子的行为,进不了大黑阔的法眼。目标驱动,为了实现提权,暴破又有何不可。
Q:本机暴破动静不小,当管理员透明?
A:ruadmin 不完美,两个致命伤你有必要了解,以评估是否具备使用环境。第一,对于开启试错锁定账号策略的环境,ruadmin 很可能导致账号被锁,存在影响业务的风险,我建议你用 –user 指定一个普通账号先测试系统是否开启锁定账号的策略,再做下一步打算;第二,ruadmin 使用的密码验证机制将导致生成大量登录失败的日志,可能引起管理员、AV 的注意,我没啥能建议,自求多福。
Q:用 hydra 暴破本地回环 127.0.0.1 的 RDP 不就行了么,没必要重造轮子。
A:hydra 官方不再支持 windows,所以,我只得在 cygwin 中源码构建可执行程序,然后把 hydra.exe 及几十个相关依赖上传到目标上执行,太麻烦。
有问题大家可以留言哦,也欢迎大家到春秋论坛中来耍一耍 >>>点击跳转