0%

从烂土豆开始的土豆家族入门

对.NET和COM一窍不通,代码一行都没写过,全篇内容由读各种文章+自行想象完成,不保证准确性,若发现错误请及时联系我更改

windows在远古版本前,各种服务都是以最高权限SYSTEM跑起来的,那个时候mssql的一个xp_cmdshell就可以一键打到底,而在某个版本后,添加了local service用户,之后iis或者mssql就被降权为了networkservice之类的账户,权限很低,直接操作几乎啥也干不了,但由于这些账户本身作为服务账户,也需要在特定的情况下拥有高权限,微软是允许这些账户进行提权的,而如果我们能对这些情况进行滥用,同样的也就可以将networkservice账户恢复到system

土豆系列提权的核心是NTLM中继,通过欺骗运行在高权限(Administrator/SYSTEM)的账户进行ntlm认证,同时作为中间人对认证过程进行劫持和重放,最后调用本地认证接口使用高权限账号的ntml认证获取一个高权限token,只要当前进程拥有SeImpersonatePrivilegeSeAssignPrimaryToken权限即可进行令牌模仿,即可取得对应权限(同理,对于直接的令牌窃取利用也需要拥有SeImpersonatePrivilege权限,感觉一般只用于Administrator提到SYSTEM,其他的用户一般来说要么没有这个权限,要么没法直接open高权限账户的token

hot potato

阅读全文 »

ProcessHollowing与ReflectiveDLL

前段时间稍微学了下进程镂空这个操作(ProcessHollowing),顺带就学了一点简单的windows PE结构,顺带复习了一下经典ReflectiveDll loader原理,理解了一下注入都是怎么做到的,最后扩展学习到了跨位数进程注入。。。

ProcessHollowing

一个已经有五六年历史的技术了,我最近才听说。。。与进程注入类似,都是拉起一个傀儡进程后使其运行恶意代码,和进程注入较大的区别是不使用CreateRemoteThread等函数,并且可以直接将一个PE放进去跑,无需对其进行额外操作(如添加ReflectiveLoader)

既然不使用CreateRemoteThread,那么必然得使用其他的危险函数,这里用的是SetThreadContext,具体思路其实很简单,读一个PE到内存中(可以不触碰磁盘),拉起傀儡进程,将傀儡进程的内存空间用NtUnmapViewOfSection一把释放掉,这样子这个进程里面就没有东西了,此时我们再将我们的PE文件填进去,就完成了一个套皮进程的运行,当然,在实现上还有很多需要考虑的地方

阅读全文 »

pollution here, pollution there, pollution everywhere

高级网络攻防课上的一个题,一个原型链污染打electron的题。龚老师要求写报告,就把报告改一下当篇wp记一下。rmb说准备当升级赛题后来又换掉了,太顶级了,完全不会electron,头都被打歪了

但是这门课上起来及其坐牢,每个人都要做web,pwn,re三个方向,会一个方向的就已经非常坐牢了,一个方向都不会的顶级坐牢。最重要的是上课讲的技术就是两句话的介绍,然后实验环节做中等偏低难度的题(这个题顶级难度),跨方向做题无比坐牢。总而言之,这个课上学的东西都不是教的,是给你布置一个奇奇怪怪的题然后自己硬学坐牢学会的。。。
得出结论:不要选这门课!!!不要选这门课!!!不要选这门课!!!

wp

题目分为两部分,server端和bot端,flag放在bot端,可以让bot访问server的页面,bot是用electron写的,看起来就是electron的xss2rce,但是完全不会electron,学了半天也不是很会

阅读全文 »

hxpCTF2022wp

又跟着科恩疯狂偷学,天哥一人单刷全部web,我在科恩后面偷看答案复现
以及,这是一场在23年办的2022ctf

valentine

有效的代码部分如下

app.post('/template', function(req, res) {
  let tmpl = req.body.tmpl;
  let i = -1;
  while((i = tmpl.indexOf("<%", i+1)) >= 0) {
    if (tmpl.substring(i, i+11) !== "<%= name %>") {
      res.status(400).send({message:"Only '<%= name %>' is allowed."});
      return;
    }
  }
  let uuid;
  do {
    uuid = crypto.randomUUID();
  } while (fs.existsSync(`views/${uuid}.ejs`))

  try {
    fs.writeFileSync(`views/${uuid}.ejs`, tmpl);
  } catch(err) {
    res.status(500).send("Failed to write Valentine's card");
    return;
  }
  let name = req.body.name ?? '';
  return res.redirect(`/${uuid}?name=${name}`);
});

app.get('/:template', function(req, res) {
  let query = req.query;
  let template = req.params.template
  if (!/^[0-9A-F]{8}-[0-9A-F]{4}-[4][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i.test(template)) {
    res.status(400).send("Not a valid card id")
    return;
  }
  if (!fs.existsSync(`views/${template}.ejs`)) {
    res.status(400).send('Valentine\'s card does not exist')
    return;
  }
  if (!query['name']) {
    query['name'] = ''
  }
  return res.render(template, query);
});
阅读全文 »

k8s入门

没事做和rmb聊天的时候,因为最近确实不知道该学啥,就扯淡的时候聊到k8s,然后想了一下感觉k8s确实很行,之前菊花入职网易的时候上手的业务也是k8s部署的,云越来越成熟的情况下学一手不是坏事

入门的一大问题在于资料有一点散,加上学习不可能有实际生产环境的部署情况,官方资料也很乱,看了一大堆文档才把各个环节理清楚

环境部署推荐使用kind,用docker作为node,2c4g的机器也能轻松部署4个node的集群

名词解释

阅读全文 »