0%

转发自安全客,https://www.anquanke.com/post/id/206430

Burpy是一款能够打通BurpSuite和Python之间任督二脉的插件,从此之后,你可以用你的python任意处理Http包了!

Burpy

首先,BurpSuite插件已经那么多了,真的缺这一个?
面对这个To be, or not to be的灵魂之问,咱们先回答一下下面的问题:

  • 你的BurpSuite中有多少插件?
  • 你有没有这样的情况:有些工作我用大python写的,测试的时候需要burpsuite,所以干活的时候是不断地在命令行、Burpsuite、浏览器三个之间来回切换。

我就遇到一个RSA加密的流量,没有这个插件,我干活的状态应该是这样的:

  • 编写一个RSA加密脚本
  • 打开一个命令行,执行命令把我的payload加密
  • 右键复制
  • 切换到BurpSuite,粘贴加密之后的payload
  • 发送请求,分析返回结果
  • 切换到命令行,更换payload,执行python脚本加密
  • 再复制
  • 再粘贴
  • 再发送请求
    ….

上面过程我才测试了两个payload,如果你有50个payload,你是不是想把电脑摔了?或者问候一下某人先人?

有朋友可能会说了,我有插件呀!
对,RSA可以弄个插件。那下一个活,不是RSA了,加了签名怎么办?
答:再写个插件!
对,如果下一个活,加密/签名算法不一样,比如有些加了时间戳,取url中后6位与时间戳合并,算32位的md5之后,把md5从中间劈开,前16位做key/后16位做iv,做了AES呢?
答:再写个插件!
….

那结果可能是,你的BurpSuite中装满了各式各样的插件!

Read more »

[TOC]

Android 9上已经不支持Xposed了,所以需要安抚Magisk Taichi。功能与Xposed基本相同。

下面的安装步骤是基于谷歌新儿子-Pixel 一代的。其他手机请在第一步的时候,也就是安装TWRP的时候选择自己的机型。

安装twrp

https://twrp.me/google/googlepixel.html

1
2
3
4
# 安装twrp
adb push twrp-pixel-installer-sailfish-3.3.0-0.zip /sdcard/
adb reboot-bootloader
fastboot boot path/to/twrp.img

在twrp里面把上面push进去的zip安装了。重启。

安装Magisk

https://github.com/topjohnwu/Magisk/releases

1
2
adb push Magisk-vxxxx.zip /sdcard
adb reboot-bootloader
Read more »

原因

自己在VPS上也可以弄,这个博客上有设置方法,还能够自动更新HTTPS证书。可自行查找。

但作为一个记录、分享型的博客,没必要用后端数据库,直接静态页面就行。

而静态页面最好就是用Markdown写作了。

那自然想到Hexo,但Hexo如果放在VPS上,还需要配置nginx或者hexo-admin插件,才能像常规CMS一样更新内容。总感觉有些不方便。

于是就有了这次的折腾。

结果

折腾完之后,工作流是这样的:

  1. 本地hex new \[文章名字\]
  2. 本地 vscode,编写markdown
  3. 写完之后,hexo g && hexo d 自动上传到gitee和github。是的,两个同时传。
  4. gitee无法绑定个人域名,github可以。所以两个都传。都免费的,不用白不用,万一其中一个不能用了,另一个顶上。

配置

Read more »

angr_ctf

一个练习angr用法的题目,里面有说明指导。https://github.com/jakespringer/angr_ctf/

因为国内相关资料太少了,所以做成了视频,更新在B站。

刚开始接触相关内容,视频只能算抛砖引砖,表达能力与水平比较低,轻喷

BiliBili 播放列表,还在持续更新
https://space.bilibili.com/386563875/channel/detail?cid=109932

QQ群:951587491
群内还是有大神的。

Read more »

Touchpad control on Linux running on Alienware is not supported by Fn+f11, so you may need this small script.

new to shell script, you might want improve it

1
2
3
4
5
6
7
8
9
#!/bin/bash

if [ "$1" == "on" ]; then
/usr/bin/xinput enable "`xinput list | grep -i touchpad | awk '{print $3" "$4" "$5}'`"
elif [ "$1" == "off" ]; then
/usr/bin/xinput disable "`xinput list | grep -i touchpad | awk '{print $3" "$4" "$5}'`"
else
echo " Usage: touchpad on/off"
fi

You might wannt to change awk '{print $3" "$4" "$5}' part so to get your whole touchpad name. Check before you run

chmod +x this.sh && ls -s this.sh .bin/touchpad is recommended.

Read more »

网址:https://overthewire.org/wargames/bandit/

目前就34个关卡,大部分比较容易,有几个需要一些搜索.

不写整体的writeup了,只写其中做的几个笔记

find

find / -type f -user xxx -group yyy -size 33c ! -executable 2>/dev/null -exec cat {} \;

cut/awk

cat data.txt | grep millionth | cut -f 2

cat data.txt | grep millionth | awk '{print $2}'

sort

cat data.txt | sort | uniq -c | sort -nr | tail -n 1 | awk '{print $2}'

Read more »

操作

在Burp中导出证书,这里的名字为burp.der.

然后在命令行中进行如下操作:

1
2
3
4
5
6
7
openssl x509 -inform DER -in burp.der -out burp.pem #转换格式
openssl x509 -inform PEM -subject_hash_old -in burp.pem | head -1 #打印hash,并将pem命名为hash.0
> 9a5ba575
cp burp.pem 9a5ba575.0
adb remount #重新mount
adb push 9a5ba575.0 /system/etc/security/cacerts/ #传上去
adb reboot #搞定

前提

  1. 手机完全root

适用

要测试的APP在容器是的容器里面,sslunpinning有时不能将所有层都hook好,导致一部分流量仍然提示证书错误.

可能遇到的问题

1
2
remount of /system failed: Read-only file system
remount failed
Read more »

初次体验基于栈溢出的PWN!

源代码

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
/*
* phoenix/stack-five, by https://exploit.education
*
* Can you execve("/bin/sh", ...) ?
*
* What is green and goes to summer camp? A brussel scout.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define BANNER \
"Welcome to " LEVELNAME ", brought to you by https://exploit.education"

char *gets(char *);

void start_level() {
char buffer[128];
gets(buffer);
}

int main(int argc, char **argv) {
printf("%s\n", BANNER);
start_level();
}

分析

stack-four基本一样,只不过buffer大了一些。
过这个关卡,不是要执行到complete_level函数了,而是要get shell。也就是通过溢出漏洞,来执行我们自己的程序,即shellcode

shellcode就是一段执行返回一个shell的汇编代码。

我们将shellcode写到栈中,再通过溢出控制RIP,让程序去执行我们在栈中写好的shellcode,从而拿到shell

所以,在栈中基本上是这样的:

image-20190411231630801.png
upload successful

为了让我们的shellcode顺利执行,nopsled最好要有,因为有比如环境变量等的影响,栈中的地址会出现小幅度的偏移。

Read more »

这个关卡是一个标准的栈溢出的例子。

源代码

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
/*
* phoenix/stack-four, by https://exploit.education
*
* The aim is to execute the function complete_level by modifying the
* saved return address, and pointing it to the complete_level() function.
*
* Why were the apple and orange all alone? Because the bananna split.
*/

#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define BANNER \
"Welcome to " LEVELNAME ", brought to you by https://exploit.education"

char *gets(char *);

void complete_level() {
printf("Congratulations, you've finished " LEVELNAME " :-) Well done!\n");
exit(0);
}

void start_level() {
char buffer[64];
void *ret;

gets(buffer);

ret = __builtin_return_address(0);
printf("and will be returning to %p\n", ret);
}

int main(int argc, char **argv) {
printf("%s\n", BANNER);
start_level();
}

分析

main调用start_levelstart_level中有一个gets函数会千万栈溢出,利用溢出漏洞我们可以控制RIP/EIP,也就是程序执行流程。通过将返回地址覆盖成complete_level函数的地址,就过关了。

实操

先来看一下主要函数部分的汇编代码:

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
000000000040061d <complete_level>:
40061d: 55 push %rbp
40061e: 48 89 e5 mov %rsp,%rbp
400621: bf f0 06 40 00 mov $0x4006f0,%edi
400626: e8 55 fe ff ff callq 400480 <puts@plt>
40062b: bf 00 00 00 00 mov $0x0,%edi
400630: e8 5b fe ff ff callq 400490 <exit@plt>

0000000000400635 <start_level>:
400635: 55 push %rbp
400636: 48 89 e5 mov %rsp,%rbp
400639: 48 83 ec 50 sub $0x50,%rsp
40063d: 48 8d 45 b0 lea -0x50(%rbp),%rax
400641: 48 89 c7 mov %rax,%rdi
400644: e8 27 fe ff ff callq 400470 <gets@plt>
400649: 48 8b 45 08 mov 0x8(%rbp),%rax
40064d: 48 89 45 f8 mov %rax,-0x8(%rbp)
400651: 48 8b 45 f8 mov -0x8(%rbp),%rax
400655: 48 89 c6 mov %rax,%rsi
400658: bf 33 07 40 00 mov $0x400733,%edi
40065d: b8 00 00 00 00 mov $0x0,%eax
400662: e8 f9 fd ff ff callq 400460 <printf@plt>
400667: 90 nop
400668: c9 leaveq
400669: c3 retq

000000000040066a <main>:
40066a: 55 push %rbp
40066b: 48 89 e5 mov %rsp,%rbp
40066e: 48 83 ec 10 sub $0x10,%rsp
400672: 89 7d fc mov %edi,-0x4(%rbp)
400675: 48 89 75 f0 mov %rsi,-0x10(%rbp)
400679: bf 50 07 40 00 mov $0x400750,%edi
40067e: e8 fd fd ff ff callq 400480 <puts@plt>
400683: b8 00 00 00 00 mov $0x0,%eax
400688: e8 a8 ff ff ff callq 400635 <start_level>
40068d: b8 00 00 00 00 mov $0x0,%eax
400692: c9 leaveq
400693: c3 retq
400694: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
40069b: 00 00 00
40069e: 66 90 xchg %ax,%ax

call汇编指令分为两个部分,

  1. 将当前指令的下一条指令地址压入栈中
  2. JMP(无条件跳转)到目标函数地址。
Read more »

stack-two基本上于stack-one一样,只不过需要设置一个环境变量,程序是从环境变量中获取的值。

源码

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
/*
* phoenix/stack-three, by https://exploit.education
*
* The aim is to change the contents of the changeme variable to 0x0d0a090a
*
* When does a joke become a dad joke?
* When it becomes apparent.
* When it's fully groan up.
*
*/

#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define BANNER \
"Welcome to " LEVELNAME ", brought to you by https://exploit.education"

char *gets(char *);

void complete_level() {
printf("Congratulations, you've finished " LEVELNAME " :-) Well done!\n");
exit(0);
}

int main(int argc, char **argv) {
struct {
char buffer[64];
volatile int (*fp)();
} locals;

printf("%s\n", BANNER);

locals.fp = NULL;
gets(locals.buffer);

if (locals.fp) {
printf("calling function pointer @ %p\n", locals.fp);
fflush(stdout);
locals.fp();
} else {
printf("function pointer remains unmodified :~( better luck next time!\n");
}

exit(0);
}

分析

main函数中并没有调用complete_level函数的地方,要完成这个关卡,需要想办法调用这个函数。
main函数中,可通过溢出gets函数,覆盖local.fp指针,将fp的值改变为complate_level函数的地址,就完成了。

实操

先查看一下二进制文件的信息:

1
2
3
4
5
6
7
8
9
user@phoenix-amd64:/opt/phoenix/amd64$ checksec ./stack-three 
[*] '/opt/phoenix/amd64/stack-three'
Arch: amd64-64-little
RELRO: No RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x400000)
RWX: Has RWX segments
RPATH: '/opt/phoenix/x86_64-linux-musl/lib'

我们发现No RELRO,也就是没有地址重定位。
通过ldd命令也可以查看是否开启了地址重定位:

1
2
3
4
5
6
7
8
9
user@phoenix-amd64:/opt/phoenix/amd64$ ldd stack-three 
linux-vdso.so.1 (0x00007ffff7ffa000)
libc.so => /opt/phoenix/x86_64-linux-musl/lib/libc.so (0x00007ffff7b45000)
user@phoenix-amd64:/opt/phoenix/amd64$ ldd stack-three
linux-vdso.so.1 (0x00007ffff7ffa000)
libc.so => /opt/phoenix/x86_64-linux-musl/lib/libc.so (0x00007ffff7b45000)
user@phoenix-amd64:/opt/phoenix/amd64$ ldd stack-three
linux-vdso.so.1 (0x00007ffff7ffa000)
libc.so => /opt/phoenix/x86_64-linux-musl/lib/libc.so (0x00007ffff7b45000)
Read more »