공격자는 권한상승 또는 지속성 유지를 위해 가용한 모든 방법을 총 동원한다. 그 중 하나가 이러한 자동실행 기능들이다. 이번 포스팅에서는 어떤 기능들이 있는지 한번 살펴볼것이다.
1. 부팅 시 자동 시작
거의 모든 컴퓨터에는 부팅 시 자동 시작 기능이 존재한다. 바로 '서비스' 라는 것인데 이는 윈도우 뿐만 아니라 리눅스, 맥에서도 지원한다. (아마 unix계열 직계후손인 BSD에도 똑같은 기능이 있지않을까?)
또 윈도우 운영체제에서는 서비스 이외에도 registry key, startup 폴더 등 다양한 방법으로 트리거할 수 있는 기능을 지원한다.
리눅스도 service외에도 init.d 또는 systemd 같은 기능이 존재한다.
이러한 기능은 사용자가 시스템을 좀더 간편하게 사용할수 있도록 도와준다거나, 또는 어떤 중요한 기능을 시스템 부팅과 동시에 시작하고 또 유지하는 등 관리 측면에서 굉장히 중요한 기능이다.
1-1. Windows 서비스
윈도우 서비스 기능을 잘 모르는 사용자도 많을 것이다. (사실 일반 사용자 입장에서는 건드리면 안좋을것 같이 생기긴 했다)
시작 버튼을 눌러 서비스 또는 service 를 입력해 톱니모양 아이콘을 한번 눌러보라
위와 같은 화면을 확인할 수 있을 것이다. 그 중에 임의의 서비스를 하나 열어보면 위 사진과 같이 서비스이름, 설명, 실행 파일 경로, 시작 유형 등이 정리된 것을 볼 수 있다.
중요한 것은 사용자가 임의로 이러한 서비스 기능을 추가할 수 있다는 것이다. 다음과 같은 시나리오를 한 번 가정해보자.
- 어떤 나쁜 블랙 해커가 사용자 계정을 탈취해 로컬 로그인에 성공했다.
- 그런데 그 사용자 계정은 관리자 권한이 없었고, 따라서 추가적인 악성 행위를 위해 권한 상승이 필요했다.
- 이것 저것 살펴보던 중 서비스에서 현재 사용자 권한으로 수정 가능한 서비스를 확인했다.
- 공격자는 곧바로 악성 파일을 다운로드하고 해당 서비스가 실행할 프로그램을 악성 파일로 변경했다.
어떤가? 서비스는 어떤 계정으로, 또 어떤 권한으로 실행될까? 악성파일은 어떤 권한을 가지게 될까?
여러분들이 한번 공부해보라!
1-2. Windows Startup 폴더
윈도우에서는 자동 실행 기능을 지원하는 폴더가 있다. 바로 다음 경로다.
C:\Users\<USER_NAME>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
아마도 사용자 디렉토리별로 존재하는걸 보았을때 계정 로그온에 성공하면 그때 실행되지 않을까?
실행 프로그램을 해당 경로에 넣는 것 만으로도 자동 실행되는 효과를 볼 수 있다.
1-3. Windows Registry
윈도우 레지스트리는 운영체제의 방대한 설정 정보를 담고있다. (사실 그래서 볼때마다 새롭다)
해당 포스팅을 작성하게된 이유이기도 하다.
필자는 MITRE ATT&CK을 보는게 취미다. 심심하면 켜서 어떤 공격방법이 있는지 살펴보곤 한다.
그런데 https://attack.mitre.org/techniques/T1547/ 이 문서에서 처음보는 레지스트리 키를 확인했다.
HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\load
HKCU니까 사용자별로 존재하는 NTUSER 하이브에 존재하는 값일 것이라 생각된다. 해당 레지스트리 키에 실행할 프로그램 경로를 작성하면 자동으로 실행된다고 한다. (찾아보니 legacy 운영체제 95,98 등에서 사용했던 키로 확인되며, 10이후로는 더이상 동작하지 않는듯..)
레지스트리에는 위 경로 말고도 자동 실행 기능이 존재하는 다른 경로들이 존재한다. 바로 다음 키들이다(다른 글에서 정리했던 것 같은 기억도 있고..)
해당 키에 프로그램 경로가 작성되어 있으면 자동 실행이 수행된다.
NTUSER
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce
SOFTWARE
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
보면 알겠지만, NTuser하이브와 SOFTWARE 하이브 두 가지에 나누어져 있다. 무슨 차이가 있을까?
많은 블로그들이 다음과 같이 설명한다.
사용자 계정으로 컴퓨터 시작 시 매번 실행
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
사용자 계정으로 컴퓨터 시작 시 한 번 실행
HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce
계정 상관없이 컴퓨터 시작 시 매번 실행
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
계정 상관없이 컴퓨터 시작 시 한 번 실행
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
틀린 설명은 아니다. 하지만 우리는 의미를 좀더 정확하게 이해해야한다. NTuser와 SOFTWARE 하이브의 차이에서부터 말이다. 해당 정보는 필자가 다른 글에서 설명했던것 같으니 지금은 그냥 넘어가도록 하겠다.
1-3. Linux 서비스
리눅스에도 윈도우와 정확하게 같은 서비스 기능이 존재한다. (사실 정확하게 같은지는 모르겠지만 의미와 동작이 얼추 같아보인다)
service --status-all
systemctl status --no-pager 등 명령을 입력하면 확인해볼 수 있다.
우리가 리눅스 시스템에서 어떤 어플리케이션을 설치하고(예를 들면 ssh 서버) 나서
systemctl enable ssh
systemctl start ssh
systemctl daemon-reload 와 같은 명령을 수행하는것도 모두 서비스에 등록하고 서비스를 시작하기 위함이다.
위와 같은 작업을 마치고나면 부팅과 동시에 시스템은 ssh 서버 서비스를 데몬으로 구동해 우리가 별도의 ssh 프로세스를 생성한다거나 하는 과정 없이 그냥 접속할 수 있게 되는 것이다.
1-4. Linux init
init은 시스템 부팅 시 필요한 바이너리 프로그램이나 서비스를 시작하기 위한, 즉 시스템 초기화와 서비스 관리를 위한 장치다. 그리고 본질적으로는 service와 차이가 없다. (사실 init이 더 먼저있었고, service가 나중에 생긴 일종의 wrapper다)
/etc/init.d 경로를 보면 시스템 구동에 필요한 다양한 서비스들을 제어하는 스크립트가 작성되어 있다.
init 만의 특징이라면 시스템의 런 레벨(run level) 에 따라 실행될 스크립트를 정의해줄 수 있다는 것이다.
런 레벨은 다음을 의미한다.
Runlevel | 의미 | 설명 |
---|---|---|
0 | Halt | 시스템 종료 (shutdown 시 사용) |
1 | Single User Mode | 단일 사용자 모드. root만 로그인 가능, 시스템 복구용 |
2 | Multi User Mode (No Network) | 여러 사용자 로그인 가능, 네트워크 없음 (Debian 계열은 있음) |
3 | Full Multi User Mode | 텍스트 기반 로그인 (CLI), 네트워크 있음 |
4 | Undefined/Custom | 대부분 미사용. 사용자 정의 runlevel로 사용 가능 |
5 | Multi User + GUI | 그래픽 모드(GUI) 제공 (예: GNOME, KDE) |
6 | Reboot | 시스템 재시작 (reboot 시 사용) |
이는 /etc/network 디렉토리의 기능과도 유사하다
(* network 디렉토리를 통해 NIC의 up, down 상태에 따라서 스크립트가 실행되도록 정의할 수 있다)
(여담으로 필자는 이 init 기능을 필자 소유의 하이퍼바이저가 무선랜으로 내부망 ip를 잡는데 사용하고있다.)
1-5. Linux systemd
기존 init의 여러 가지 단점을 해결하고자 새로운 서비스 관리 도구가 등장했다. 그리고 그것이 바로 systemd다.
기존의 init은 다음과 같은 단점들을 갖고있었다
- 스크립트 순차 처리로 인해 부팅 속도 저하(느림)
- 복잡한 서비스 간 의존성 관리 어려움
- 서비스 상태 확인 어려움
- 상태 확인, 재시작, 로그 관리 기능 부족
- 표준화 부족(배포판마다 run level이 다른 등..)
뭐 이런 여러가지 불편하고 아쉬운 부분들이 있었고, systemd 가 등장함에 따라 점차 systemd로 넘어가는 추세다.(아직 init 기능을 지원하긴 한다. service 는 init, systemctl 은 systemd 와 관련있다)
systemd는 run level대신 target이라는 개념으로 바꿔 사용한다.(거의 비슷하긴 하다)
1-6. Linux rc
정말 legacy 기능이다. 가끔 사고분석이나, 취약점 분석을 할때 오래전 커널을 사용하는 배포판에서 볼 수 있다. init과 유사한 기능이나, init보다 이전에 존재하던 기능이다.
/etc/rc, /etc/rc.local 파일이 있고
/etc/rc.d 디렉토리 안에 run level 별로 구분되어 있다.
2. 주기적인 작업 자동 시작
서비스는 시스템 초기화를 위해 사용되었다면 작업 관리자는 주기적으로 실행되어야 하는 어떤 작업을 정의할때 사용된다.
2-1. Windows 작업 스케쥴러(Task Scheduler)
시작 버튼을 누르고 작업 스케쥴러를 검색, 실행해보자.
위 사진과 같은 창을 보았다면, 여러분은 성공적으로 작업 스케쥴러를 실행한것이다. 각 항목들을 잘 살펴본다면 어떤 특정 프로그램이 일정한 타이밍, 또는 일정한 주기로 실행되도록 설정된 것을 볼 수 있을것이다.
2-2. Linux Cron
Linux에서는 Cron이라는 기능으로 이러한 주기적인 작업을 관리할 수 있다. 영어나 또는 게임에 관심이 많은 독자라면 어디서 많이 본듯한 단어라고 느낄 수 있다. 예를 든다면.. 크로노스, 크로노 트리거 등등..
이는 시간을 의미하는 그리스어 chronos에서 어원을 딴것으로 생각된다(아마도)
해당 포스팅은 cron을 사용하는 방법에 대한포스팅은 아니므로 자세하게 사용하는 방법은다루지 않는다. 이상.
'콤푸타 > 해킹&보안' 카테고리의 다른 글
보이스피싱 번호, 웹페이지 공개 (0) | 2025.06.19 |
---|---|
[windows] 윈도우 관리도구(mmc, cpl, msc, exe) 정리 (0) | 2025.06.18 |
악성파일 무료 다운로드 (0) | 2025.04.26 |
IP 분석 OSINT (0) | 2025.04.26 |
[network] OSI 7 layer (0) | 2025.04.15 |