·çÆ® µð·ºÅ丮¸¦ º¯°æÇÑ´Ù.
1.1. »ç¿ë¹ý
#include <unistd.h>
int chroot(const char *path);
|
1.2. ¼³¸í
chroot()´Â path°¡ ÁöÁ¤ÇÑ °÷À¸·Î ·çÆ® µð·ºÅ丮¸¦
º¯°æÇÑ´Ù. µð·ºÅ丮´Â "/"·Î ½ÃÀÛÇÏ´Â Àý´ë°æ·Î À̸§À» »ç¿ëÇÑ´Ù.
¼³Á¤µÈ ·çÆ®µð·ºÅ丮´Â ÇöÀç ÇÁ·Î¼¼½ºÀÇ ¸ðµç ÀÚ½Ä ÇÁ·Î¼¼½º¿¡°Ô »ó¼ÓµÈ´Ù.
´ÜÁö ½´ÆÛÀ¯Àú¸¸ÀÌ ·çÆ® µð·ºÅ丮¸¦ º¯°æÇÒ ¼ö ÀÖ´Ù.
ÀÌ ½Ã½ºÅÛ ÄÝÀº ÇöÀç ÀÛ¾÷ µð·ºÅ丮¸¦ ¹Ù²ÙÁö´Â ¾Ê´Â´Ù. ±×·¡¼
"."Àº "/"·Î ÁöÁ¤µÈ ·çÆ® Æ®¸® ¹ÛÀÇ À§Ä¡°¡ µÉ ¼öµµ ÀÖ´Ù.
1.3. ¹Ýȯ°ª
¼º°ø½Ã 0ÀÌ ¸®Åϵǰí, ¿¡·¯°¡ ¹ß»ýÇϸé -1ÀÌ ¸®ÅϵȴÙ.
1.4. ¿¡·¯
- EPERM
À¯È¿ UID°¡ 0ÀÌ ¾Æ´Ï´Ù.
- EFAULT
path°¡ Á¢±ÙÇÒ ¼ö ¾ø´Â ¸Þ¸ð¸® ¿µ¿ªÀ» °¡¸®Å°°í ÀÖ´Ù.
- ENAMETOOLONG
path°¡ ³Ê¹« ±æ´Ù.
- ENOENT
ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾Ê´Â´Ù.
- ENOMEM
Ä¿³Î ¸Þ¸ð¸®°¡ ÃæºÐÇÏÁö ¾Ê´Ù.
- ENOTDIR
path°¡ µð·ºÅ丮°¡ ¾Æ´Ï´Ù.
- EACCESS
Çã°¡°¡ °ÅºÎµÇ¾ú´Ù.
- ELOOP
path¸¦ ã¾Æ°¡±â À§ÇØ ³Ê¹« ¸¹Àº ½Éº¼¸¯ ¸µÅ©°¡ Á¸ÀçÇÑ´Ù.
- EIO
I/O ¿¡·¯°¡ ¹ß»ýÇß´Ù.
1.5. ¿¹Á¦
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
int pid;
if (chroot("/home/mydir") != 0)
{
perror("chroot");
exit(0);
}
if (execl("/bin/bash","bash", NULL) == -1)
{
perror("error");
}
}
|
À§ Äڵ带 ÄÄÆÄÀÏ ÈÄ ½ÇÇà ½Ã۸é /home/mydir°¡ ·çÆ®(/)µð·ºÅ丮°¡
µÇ°í bash°¡ ½ÇÇàµÈ´Ù. ·çÆ® µð·ºÅ丮°¡ ¹ÙÄ×À¸¹Ç·Î /home/mydir/bin ¹Ø¿¡
bash½©ÀÌ ÀÖ¾î¾ß ÇÑ´Ù. ¶ÇÇÑ bash¸¦ ½ÇÇà½Ã۱â À§ÇÑ ±âº»ÀûÀÎ ¶óÀ̺귯¸®µµ
ÀÖ¾î¾ß Çϴµ¥ ldd ¸¦ ÅëÇØ¼ bash¸¦ ½ÇÇà½Ã۱â À§ÇØ ÇÊ¿äÇÑ ¶óÀ̺귯¸®ÀÇ
¸ñ·ÏÀ» ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù. /home/mydir/lib µð·ºÅ丮 ¹Ø¿¡ ÇÊ¿äÇÑ ¶óÀ̺귯¸®¸¦
º¹»çÇÑ´ÙÀ½ À§ ÇÁ·Î±×·¥À» ½ÇÇàÇϵµ·Ï ÇÏÀÚ.
- DeleteMe:½ÇÁ¦ chroot¿¡¼´Â "/bin/bash"¸¦ Á÷Á¢ ½ÇÇàÇÏÁö ¾Ê°í "/bin/sh"¸¦ ½ÇÇàÇϵµ·Ï À¯µµµÇ´Â°Ô ¸Â´Ù°í »ý°¢ÇÕ´Ï´Ù. yundream´Ô È®ÀκÎŹµå·Á¿ä. - minzkn
- ³× À̰Š¿Ï¼º ¸Þ´º¾óÀÌ ¾Æ´Õ´Ï´Ù. ÀÌ»óÇÏ°Ô Á¦²¨ ¸®´ª½º¿¡¼´Â Å×½ºÆ®°¡ ¾ÈµÇ¾î¼¿ä.. ¹ö±×ÀÎÁö ¸ÕÁö´Â ¸ð¸£°Ú´Âµ¥.. "/bin/bash"¸¦ ÀÚ²Ù ¸øÃ£´Â´Ù°í.. ¹°·Ð /bin/sh·Î µµ ÇØºÃ±¸¿ä.. ±Ùµ¥.. ´Ù¸¥ ºÐÀº Å×½ºÆ®°¡ Á¦´ë·Î µÈ´Ù°í Çϰí -.-;. ¾Æ¹«·¡µµ ´Ù¸¥ Å×½ºÆ® µÇ´Â ºÐÀÌ È®ÀÎÀ» ÇØÁà¾ß ÇÒ°Í °°´Ù´Â minzkn´ÔÀÌ ÇØÁÖ½Ç ·Á³ª È÷Èý.. minzkn ´ÔÀº Àú ¿¹Á¦ Á¦´ë·Î ½ÇÇà µÇ³ª¿ä ? ³õÄ¡°í ÀÖ´Â ¹«¾ð°¡°¡ Àִ°ÇÁö
- ±âº»ÀûÀ¸·Î /home/mydir/bin/sh ¶Ç´Â /home/mydir/bin/bash °¡ ÀÖ¾î¾ß °ÚÁö¿ä. yundream´Ô º¹»çÇϽðí ÇϽŰÅÁÒ? ±×¸®°í ¸¸¾à º¹»ç¸¦ ÇÏÁö ¾Ê¾Æµµ µÇµµ·Ï ÇÏ·Á¸é chroot ÁøÀÔÀü¿¡ ÇØ´ç ½ÇÇàÆÄÀÏ À̹ÌÁö¸¦ Àоî³õ°í chroot ÁøÀÔÇÏ¿© ½ÇÇàÀ̹ÌÁö¸¦ ÀÓÀÇÀÇ À§Ä¡¿¡ ÀúÀåÇÏ°í ½ÇÇàÇØ¾ß °Ú³×¿ä. ±×¸®°í /bin/sh ÀÇ Àǹ̴ ÀÚ½ÅÀÇ shellÀÌ ¾î¶²°ÍÀ̶ó°í ¾Ë¸®´Â link À̰í¿ä. ¶§¹®¿¡ Á¤È®È÷ yundream´ÔÀÇ ¿¹Á¦ Äڵ带 Å×½ºÆ®Çغ¸±â À§Çؼ´Â /usr/mydir/bin/bash °¡ ÀÖ¾î¾ß Çϰí /usr/mydir/bin/sh ´Â ./bash ·Î ¸µÅ©°¡ °É·ÁÀÖ¾î¾ß Çϰí¿ä. ¶ÇÇÑ chroot ÇÔ¼ö´Â root À¯Àú¸¸ÀÌ ±ÇÇÑÀ» °®´Â Ư±Ç ¸í·ÉÀ̹ǷΠroot À¯Àú·Î ½ÇÇàÇØ¾ß Çϰڰí¿ä. ±×¸®°í chroot ½ÇÇàÈÄ¿¡ chdir("/") ÇÔ¼ö°¡ È£ÃâµÇ´Â°Ô ÁÁ´Ù´Â »ý°¢ÀÌ µå³×¿ä.
ȯ°æ Àû¿ëÀü¿¡ È®ÀÎ...
/home/mydir/bin/bash
/home/mydir/bin/sh -> ./bash
/home/mydir/lib/libtermcap.so.2
/home/mydir/lib/libdl.so.2
/home/mydir/lib/libc.so.6
/home/mydir/lib/ld-linux.so.2
const char __mydir__[] = {"/home/mydir"};
const char __root__[] = {"/"};
const char __shell__[] = {"/bin/sh"};
if(chroot(__mydir__) == 0){
chdir(__root__);
setenv("SHELL", "/bin/bash", 1);
setenv("LD_LIBRARY_PATH", "/lib", 1); /* ±×¹Û¿¡ ÇÊ¿äÇÑ È¯°æº¯¼öµé... */
(void)execl(__shell__, __shell__, (void *)0);
}
fprintf(stdout, "¿¡·¯³µ¾î¿ä. Å«ÀÏÀÌ¿¹¿ä. Á¾·áµÇ¿ä. \n");
- Çã°Å°Å°Å°Å°Æ.. libc¿Í ld-linux¸¦ º¹»çÇÏÁö ¾Ê¾Ò³×¿ä -.-; ¸¶Àú º¹»çÇÏ°í ³ª¼ Å×½ºÆ® Çϴϱî Àߵdz׿ä T.T - yundream