๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[๋ฆฌ๋ ์ค ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ] ๋ฐ๋ชฌ ํ๋ก์ธ์ค ๋ณธ๋ฌธ
[๋ฆฌ๋ ์ค ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ] ๋ฐ๋ชฌ ํ๋ก์ธ์ค
์ง์ง์ํ์นด 2024. 2. 12. 20:00<์์์ง ๋์ ์ฌ๋ฌผ์ธํฐ๋ท์ ์ํ ๋ฆฌ๋ ์ค ํ๋ก๊ทธ๋๋ฐ with ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ์์ ์ ์ฐธ๊ณ ํด์ ์์ฑํ์์ต๋๋ค :-)>
โญ ๋ฐ๋ชฌ ํ๋ก์ธ์ค
์์คํ ์๋น์ค๋ ๋ฐ๋ชฌ (Daemon) ์ด๋ผ๋ ํํ์ ํ๋ก์ธ์ค๋ก ์คํ๋๋ค
๋ฐ๋ชฌ์ ์ผ๋ฐ์ ์ผ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํ๋๋ ํ๋ก๊ทธ๋จ
ํฐ๋ฏธ๋์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ํฐ๋ฏธ๋๋ก ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ printf() ๋ฑ์ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค
๋ฐ๋ชฌ ํ๋ก์ธ์ค๋ฅผ ๋ง๋ค๋ ค๋ฉด, umaks() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ๋ชฌ์ด ์์ฑํ๋ ํ์ผ์ ์ ๊ทผ๊ถํ์ ๋ฏธ๋ฆฌ ์ค์ ํ๋ค
์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ๋ง๋ค์ด ์ธ์ ๊ณผ ๊ทธ๋ฃน์ ๋ฆฌ๋๋ก ๋ง๋ค๊ณ , ํฐ๋ฏธ๋ ์ ์ด์ ๊ด๋ จ๋ ์๊ทธ๋์ ๋ชจ๋ ๋ฌด์ํ๋ค
ํ๋ก์ธ์ค์์์ ๋๋ ํฐ๋ฆฌ๋ฅผ '/' ๋ก ์ค์ , ์ด๋ฆฐ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ชจ๋ ๋ซ๋๋ค
ํฐ๋ฏธ๋๊ณผ ๊ด๋ จ๋ ํ์ค ์ ๋ ฅ๊ณผ ํ์ค ์ถ๋ ฅ, ํ์ค ์๋ฌ์ ๋ํด ์ฌ์ฉํ ์ ์๋๋ก ์ฒ๋ฆฌํ๊ณ , ๋ฐ๋ชฌ๊ณผ ๊ด๋ จ๋ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ฉด ๋๋ค
โ๏ธ ๋ฐ๋ชฌ ํ๋ก์ธ์ค ํน์ง
๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ init ํ๋ก์ธ์ค๋ผ๋ ๊ฒ
๋ถ๋ชจ๋ฅผ init ํ๋ก์ธ์ค๋ก ๋ง๋ค๊ธฐ ์ํด, ํ๋ก์ธ์ค๋ฅผ ๋ง๋ค์ด์ ๋ถ๋ชจ ํ๋ก์ธ์ค๋ ์ข ๋ฃํ๊ณ , ์์ ํ๋ก์ธ์ค๋ ์ธ์ ๊ณผ ๊ทธ๋ฃน์ ๋ฆฌ๋๊ฐ ๋๊ฒ ํ๋ค
setsid() ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ฌ์ ํ๋ก์ธ์ค๊ฐ ๊ทธ๋ฃน์ ๋ฆฌ๋๊ฐ ์๋๋ฉด, ์๋ก์ด ์ธ์ ์ ์์ฑํด ์๋ก์ด ์ธ์ ๊ณผ ์๋ก์ด ๊ทธ๋ฃน์ ๋ฆฌ๋๊ฐ ๋๋๋ก ํ๊ณ , ํฐ๋ฏธ๋์ ์ ์ดํ์ง ๋ชปํ๋๋ก ํ๋ค
๋ฐ๋ชฌ ํ๋ก์ธ์ค๊ฐ ์คํ๋๋ค๊ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํฐ๋ฏธ๋์ด๋ ํ์ผ ์ ์ถ๋ ฅ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ๋ฉ์์ง๋ฅผ ๋จ๊ธธ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค
syslog() ํจ์๋ฅผ ์ด์ฉํ์ฌ ๋ก๊ทธ ํ์ผ์ ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํ ์ ์๋๋ฐ, ๋ก๊ทธ ํ์ผ์ /var/log/syslog ์ ์์นํ๋ค
// daemon.c
// ๋ฐ๋ชฌ ํ๋ก์ธ์ค๋ฅผ ๋ง๋ค๊ธฐ
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <string.h>
#include <syslog.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/resource.h>
int main(int argc, char **argv)
{
struct sigaction sa; /* ์๊ทธ๋ ์ฒ๋ฆฌ๋ฅผ ์ํ ์๊ทธ๋ ์ก์
*/
struct rlimit rl;
int fd0, fd1, fd2, i;
pid_t pid;
if(argc < 2) {
printf("Usage : %s command\n", argv[0]);
return -1;
}
/* ํ์ผ ์์ฑ์ ์ํ ๋ง์คํฌ๋ฅผ 0์ผ๋ก ์ค์ */
umask(0);
/* ์ฌ์ฉํ ์ ์๋ ์ต๋์ ํ์ผ ๋์คํฌ๋ฆฝํฐ ์ ์ป๊ธฐ */
if(getrlimit(RLIMIT_NOFILE, &rl) < 0) {
perror("getlimit()");
}
if((pid = fork()) < 0) {
perror("error()");
} else if(pid != 0) { /* ๋ถ๋ชจ ํ๋ก์ธ์ค๋ ์ข
๋ฃํ๋ค. */
return 0;
}
/* ํฐ๋ฏธ๋์ ์ ์ดํ ์ ์๋๋ก ์ธ์
์ ๋ฆฌ๋๊ฐ ๋๋ค. */
setsid();
/* ํฐ๋ฏธ๋ ์ ์ด์ ๊ด๋ จ๋ ์๊ทธ๋์ ๋ฌด์ํ๋ค. */
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if(sigaction(SIGHUP, &sa, NULL) < 0) {
perror("sigaction() : Can't ignore SIGHUP");
}
/* ํ๋ก์ธ์ค์ ์ํน ๋๋ ํฐ๋ฆฌ๋ฅผ ‘/’๋ก ์ค์ ํ๋ค. */
if(chdir("/") < 0) {
perror("cd()");
}
/* ํ๋ก์ธ์ค์ ๋ชจ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ซ๋๋ค. */
if(rl.rlim_max == RLIM_INFINITY) {
rl.rlim_max = 1024;
}
for(i = 0; i < rl.rlim_max; i++) {
close(i);
}
/* ํ์ผ ๋์คํฌ๋ฆฝํฐ 0, 1๊ณผ 2๋ฅผ /dev/null๋ก ์ฐ๊ฒฐํ๋ค. */
fd0 = open("/dev/null", O_RDWR);
fd1 = dup(0);
fd2 = dup(0);
/* ๋ก๊ทธ ์ถ๋ ฅ์ ์ํ ํ์ผ ๋ก๊ทธ๋ฅผ ์ฐ๋ค. */
openlog(argv[1], LOG_CONS, LOG_DAEMON);
if(fd0 != 0 || fd1 != 1 || fd2 != 2) {
syslog(LOG_ERR, "unexpected file descriptors %d %d %d", fd0, fd1, fd2);
return -1;
}
/* ๋ก๊ทธ ํ์ผ์ ์ ๋ณด ์์ค์ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๋ค. */
syslog(LOG_INFO, "Daemon Process");
while(1) {
/* ๋ฐ๋ชฌ ํ๋ก์ธ์ค๋ก ํด์ผ ํ ์ผ์ ๋ฐ๋ณต ์ํ */
}
/* ์์คํ
๋ก๊ทธ๋ฅผ ๋ซ๋๋ค. */
closelog();
return 0;
}
/*
ํ์ผ ์์ฑ์ ์ํ ๋ง์คํฌ๋ฅผ umask() ํจ์๋ฅผ ํตํด 0์ผ๋ก ์ค์ ํ๊ณ ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ค
๋ถ๋ชจ ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํ ํ ์์ ํ๋ก์ธ์ค๋ฅผ ์ธ์
๋ฆฌ๋๋ก ๋ง๋ค์ด ํฐ๋ฏธ๋ ์กฐ์์ ํ์ง ๋ชปํ๊ฒ ๋๋ค
ํฐ๋ฏธ๋ ์ ์ด์ ๊ด๋ จ๋ ์๊ทธ๋์ ๋ฌด์ํ๊ณ ํ๋ก์ธ์ค์ ํ์ฌ ์ํน ๋๋ ํฐ๋ฆฌ๋ฅผ '/' ๋ก ์ค์ ํ๋ค
๋ชจ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ซ๊ณ ํ์ค ์
๋ ฅ(0), ํ์ค ์ถ๋ ฅ(1), ํ์ค ์๋ฌ(2) ๋ฅผ 'dev/null' ๋ก ์ฐ๊ฒฐํ๋ค
์๋ก์ด ํ๋ก์ธ์ค๋ ๋ฐ๋ชฌ ํ๋ก์ธ์ค์ฒ๋ผ ๋์ํใท
๋ฐ๋ชฌ ํ๋ก์ธ์ค๋ ํฐ๋ฏธ๋ ์
์ถ๋ ฅ๊ณผ ํ์ผ ์
์ถ๋ ฅ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๋ฐ์ ์ ๊ด๋ จ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ ์ ์๋ค
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ์ ๋์ค์์๋ ์์คํ
๋ก๊ทธ ๋ฐ๋ชฌ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋์ํ๋ค
์ด ์์คํ
๋ก๊ทธ ๋ฐ๋ชฌ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ฉด /var/log/ ๋๋ ํฐ๋ฆฌ์ ๊ด๋ จ ๋ฉ์์ง๋ค์ ์ ์ฅํ๋๋ฐ, openlog(), syslog(), close() ํจ์๋ฅผ ์ด์ฉํ ์ ์๋ค
์ปดํ์ผ ์คํํ ๋ ์คํ ํ์ผ ๋ค์ ๋ช
๋ น์ด์ ์ด๋ฆ์ ์
๋ ฅํด์ผ ํ๋ค
ํ๋ก๊ทธ๋จ์ ์คํ์ ํฐ๋ฏธ๋๋ก ํ์ธํ ์ ์์ผ๋ฏ๋ก ps ์ ํธ๋ฆฌํฐ๋ฅผ ์ด์ฉํ์
gani@gani:~/raspi/NetworkProgramming $ gcc -o daemon daemon.c
gani@gani:~/raspi/NetworkProgramming $ ./daemon ls
gani@gani:~/raspi/NetworkProgramming $ ps aux | grep daemon
*/
gcc -o daemon daemon.c
./daemon ls
ps aux | grep daemon
โ๏ธ ์ธํฐ๋ท ํจํท ๋ชจ๋ํฐ๋ง: Wireshark
๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ, ๋๋ฒ๊น ์ด ์ด๋ ต๋ค
๋คํธ์ํฌ ๋ง์ ํตํด์ ๋ฐ์ดํฐ๊ฐ ์ ์ก๋๋ฏ๋ก ์๋ฒ์์ ๋ฐ์ดํฐ๊ฐ ์ ๋๋ก ์ค์ง ์๋๊ฐ, ํด๋ผ์ด์ธํธ์์ ์์ฒญ์ ์ ๋๋ก ํ์ง ๋ชปํ๋ ๋ฑ ํ์ธํด์ผ ํ๋ค
๋คํธ์ํฌ ๋ง์์ ํจํท์ ์ก์์ ์ง์ ํ์ธํ ์ ์์ผ๋ฉด ํธ๋ฆฌํจ
ํจํท ์บก์ฒ ๋๊ตฌ๋ฅผ ์ค๋์ดํผ (sniffer) ๋ผ๊ณ ๋ ๋ถ๋ฅด๋๋ฐ, ๋ฆฌ๋ ์ค์์๋ ์ด๋ฌํ ๋คํธ์ํฌ ํจํท์ ์ง์ ํ์ธํ ์ ์๋ dSniff, Ettercap, tcpdump, Wireshart ๋ฑ์ ๋ค์ํ ํจํท ์บก์ฒ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ค
ํจํท ์บก์ฒ ๋๊ตฌ๋ฅผ ์ด์ฉํ๋ฉด ์บก์ฒ๋ ํจํท์ ํตํด ํ๋กํ ์ฝ ๊ตฌ์กฐ๋ฅผ ํ์ธํ ์ ์์ผ๋ฉฐ, ์ง์ ์์ฑํ ํ๋กํ ์ฝ์ ํ ์คํธํ ๋ ์ ์ ์๋ํ๋์ง ํ์ธํ ์ ์๋ค
ํ์ฌ ๋คํธ์ํฌ์์ ๋์๋ค๋๋ ์ํธํ ๋์ง ์์ ์ ๋ณด๋ ๋ชจ๋ ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์์ ์ธ ์ฉ๋๋ก ์ฌ์ฉํ์ง ์๋๋ก ์ฃผ์๊ฐ ์๊ตฌ๋๋ค
๋ฆฌ๋ ์ค์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋๊ตฌ๊ฐ Wireshark
Wireshark ๋ GUI ๋ฅผ ์ง์ํ๊ณ , ํํฐ๋ง ์ต์ ๊ณผ ์ ๋ ฌ์ ํตํด ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์๋ค
๊ธฐ๋ณธ์ ์ผ๋ก tcpdump ๋ ์ฌ์ฉํ๊ณ ์๋ pcap ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ tcpdump ์ ๋งค์ฐ ์ ์ฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํจ
๋คํธ์ํฌ ์ธํฐํ์ด์ค ๋ชจ๋๋ฅผ promiscuous(๋ฌด์ฐจ๋ณ) ๋ชจ๋๋ก ์ค์ ํด์ ๋คํธ์ํฌ ์์ ๋ชจ๋ ํจํท๋ค์ ํ์ธํ ์ ์์ผ๋ฉฐ, ์ ์๋ ค์ง ํ๋กํ ์ฝ์ ์ง์ ๋ถ์ํ์ฌ ๋ด์ฉ์ ํ์ํด์ค๋ค
๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์์ Wireshark ์ค์นํ๋ ค๋ฉด apt-get ์ฌ์ฉํ์ฌ ํด๋น ํจํค์ง๋ฅผ ์ค์นํ๋ค
sudo apt-get install wireshark
Wireshark ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ X์๋๊ฐ ํ์ํ๋ค
ํจํท๋ค์ ์์๋ณ๋ก ๊ตฌ๋ถํ์ฌ ๋ณด์ฌ์ฃผ๊ณ , ์์ค์ ๋ชฉ์ ์ง์ MAC ์ฃผ์์ IP (TCP, UDP) ํฌํธ ๋ฒํธ, ํ๋กํ ์ฝ, ํจํท ๋ด์ฉ ๋ฑ ์ธ๋ถ์ ์ธ ์ ๋ณด๋ค์ ํ์ํ๋ค
์ค์๊ฐ์ผ๋ก ๋คํธ์ํฌ ํจํท์ ๋ถ์์ด ๊ฐ๋ฅํ๊ณ , ํ์ฌ ๋ถ์๋๋ ๋ด์ฉ์ ์ ์ฅํ์ฌ ๋์ค์ ํ์ธํ ์ ์๋ค
Statics ๋ฉ๋ด์์ ๊ธฐ๋ณธ์ ์ธ ํต์ ๊ธฐ๋ฅ๋ ์ ๊ณตํ๋ฉฐ, OSI 7๊ณ์ธต๋ณ๋ก ์ธ๋ถ์ ์ธ ํ๋กํ ์ฝ์ ๋ํ ๊ตฌ์กฐ๋ ์ ๊ณตํ๋ค
ํน์ ๋จ๋ง๊ณผ์ ๋คํธ์ํฌ ํต์ ์ ๋ณด๊ฐ ํ์ํ ๊ฒฝ์ฐ์ Endpoints ํญ๋ชฉ์ ์ฌ์ฉํ๋ฉด ์ข๋ค