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 及几十个相关依赖上传到目标上执行,太麻烦。

ruadmin windows渗透的更多相关文章

  1. HTML5 播放 RTSP 视频的实例代码

    目前大多数网络摄像头都是通过 RTSP 协议传输视频流的,但是 HTML 并不标准支持 RTSP 流。本文重点给大家介绍HTML5 播放 RTSP 视频的实例代码,需要的朋友参考下吧

  2. 利用Node实现HTML5离线存储的方法

    这篇文章主要介绍了利用Node实现HTML5离线存储的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. 详解如何通过H5(浏览器/WebView/其他)唤起本地app

    这篇文章主要介绍了详解如何通过H5(浏览器/WebView/其他)唤起本地app的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. H5混合开发app如何升级的方法

    本篇文章主要介绍了H5混合开发app如何升级的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. AmazeUI 折叠面板的实现代码

    这篇文章主要介绍了AmazeUI 折叠面板的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码

    这篇文章主要介绍了HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  7. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  8. html5唤起app的方法

    这篇文章主要介绍了html5唤起app的方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. HTML5拍照和摄像机功能实战详解

    这篇文章主要介绍了HTML5拍照和摄像机功能实战详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部