▷ 작성자 : 니키 (ngnicky@a3sc.co.kr)
▷ 편집자 : 니키 (ngnicky@a3sc.co.kr)

MySQL 에서 Column값을 삽입하는 과정에서 MAX값을 체크하지 않아 정해진 크기 이후로 입력되는 값이 생략되면서, 관리자 권한 우회 가능성이 존재합니다.

현재 MySQL 뿐 아니라 MS-SQL 대상으로 연구중입니다.

원본 URL : http://www.suspekt.org/2008/08/18/mysql-and-sql-column-truncation-vulnerabilities/

아래는 MySQL 5.0에서 점검한 내용으로써, 내용처럼 특수문자가 짤린 상태에서 정상적으로 입력되는 것을 볼 수 있습니다. 공격자가 악의적으로 관리자 아이디(admin)가 존재할 시에 동일한 아이디를 생성할 가능성이 존재하겠죠?.
프로세스 차원에서 'admin'이라는 사용자는 모두 관리자 권한을 주고 있다면 관리자 권한까지 획득할 가능성이 존재합니다.




아래는 MS-SQL 2000에서 점검한 내용인데 정해진 길이 이상으로 입력시에는 에러가 발생하고 있습니다. 다른 차원에서 접근을 해보면서 지속적으로 연구해볼 문제인듯 합니다.



대응방안

[소스레벨]

- 서버스크립트단에서 길이체크를 해서 정해진 문자 크기 이상으로 DBMS에 저장이 되지 않도록 해야 합니다.

[DBMS레벨]
- MySQL 인 경우에는 UDF(User Defined-Function)을 활용해야 합니다.
- MS-SQL 과 Oracle인 경우에는 개별 프로시저를 활용해야 합니다.
※ DMMS레벨은 더 조사를 하고 앞으로 정리를 하도록 하겠습니다.


Copyright(c) 1998-2008 A3 Security ,LTD


Disclaimer
※ 현재 ㈜에이쓰리시큐리티에서 테스트 및 분석 중에 있으며, 이 문서는 계속 업데이트될 것입니다. 본 문서는 보안취약점으로 인한 피해를 최소화하는 데 도움이 되고자 작성되었으나, 본 문서에 포함된 대응방안의 유효성이나 기타 예상치 못한 시스템의 오작동 발생에 대하여서는 ㈜에이쓰리시큐리티에서는 일체의 책임을 지지 아니합니다.

▷ 작성자 : 이택현 컨설턴트
▷ 편집자 : 니키 (ngnicky@a3sc.co.kr)


이택현 컨설턴트가 작년에 작성한 내용을 편집하였습니다.


원격 터미널 서비스 활성화 (콘솔모드)

세부내용

윈도우 CMD 모드에서 윈도우 원격 데스크탑 서비스를 활성화 하는 방법입니다.
재부팅 하지 않아도 원격 터미널 서비스가 활성화 됩니다.

1. 원격 터미널 서비스 활성화
REG ADD "\\<Computername>\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0x00 /f
REG ADD "\\<Computername>\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v AllowTSConnections /t REG_DWORD /d 0x01 /f
REG ADD "\\<Computername>\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fAllowToGetHelp /t REG_DWORD /d 0x01 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0x00 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v AllowTSConnections /t REG_DWORD /d 0x01 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v "fAllowToGetHelp" /t REG_DWORD /d 0x01 /f

2. 원격 터미널 서비스 비 활성화
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0x01 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v AllowTSConnections /t REG_DWORD /d 0x00 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fAllowToGetHelp /t REG_DWORD /d 0x00 /f



다음은 터미널이 오픈된 상태를 보여주고 있습니다.




Copyright(c) 1998-2009 A3 Security ,LTD


Disclaimer
※ 현재 ㈜에이쓰리시큐리티에서 테스트 및 분석 중에 있으며, 이 문서는 계속 업데이트될 것입니다. 본 문서는 보안취약점으로 인한 피해를 최소화하는 데 도움이 되고자 작성되었으나, 본 문서에 포함된 대응방안의 유효성이나 기타 예상치 못한 시스템의 오작동 발생에 대하여서는 ㈜에이쓰리시큐리티에서는 일체의 책임을 지지 아니합니다.

Status bar spoofing

웹 어플리케이션 2009. 1. 5. 17:35 Posted by TEAMCR@K
▷ 작성자 : 이택현 컨설턴트
▷ 편집자 : 니키 (ngnicky@a3sc.co.kr)


이택현 컨설턴트가 작년에 작성한 내용을 편집하였습니다.


Status bar spoofing

세부내용

1. status bar spoofing 취약점
onmouseover 태그를 이동하여 Status 바에 표시되지 않는 URL로 유도되도록 악의적인 목적으로 이용될 수 있습니다.
Internet Explorer에서는 모두 적용이 됩니다.

<html>
<body>
<a href="http://www.attacker.com" onmousemove="window.status='http://www.naver.c
om';" onmouseout="window.status='완료.';">click</a>
</body>
</html>



2. 구글 ads 와 조합
다음은 구글 ads 를 이용하여 타 사이트로 Rediretion 시키는 예제입니다.
<html>
<body>
<a href="http://www.google.com/pagead/iclk?sa=l&ai=Br3ycNQz5Q-fXBJGSiQLU0eDSAueHkArnhtWZAu-FmQWgjlkQAxgFKAg4AEDKEUiFOVD-4r2f-P____8B
oAGyqor_A8gBAZUCCapCCqkCxU7NLQH0sz4&amp;amp;num=5&adurl=http://www.a3sc.co.kr" onmousemove="window.status='http://www.citibank.co.kr
';" onmouseout="window.status'완료.';">http://www.citibank.co.kr</a>
</body></html>


세부내용
메일이나 게시판 등에 의해 공격 가능성이 존재합니다. 확인되지 않는 링크는 클릭을 하지 않길 바랍니다.
의심되는 경우에는 [소스보기]를 통해서 재확인을 하시길 바랍니다.


Copyright(c) 1998-2008 A3 Security ,LTD


Disclaimer
※ 현재 ㈜에이쓰리시큐리티에서 테스트 및 분석 중에 있으며, 이 문서는 계속 업데이트될 것입니다. 본 문서는 보안취약점으로 인한 피해를 최소화하는 데 도움이 되고자 작성되었으나, 본 문서에 포함된 대응방안의 유효성이나 기타 예상치 못한 시스템의 오작동 발생에 대하여서는 ㈜에이쓰리시큐리티에서는 일체의 책임을 지지 아니합니다.



XP_SP2_Registry_Backdoor

서버/WAS/DBMS 2009. 1. 5. 17:09 Posted by TEAMCR@K

▷ 작성자 : 이택현 컨설턴트
▷ 편집자 : 니키 (ngnicky@a3sc.co.kr)


이택현 컨설턴트가 작년에 작성한 내용을 편집하였습니다.

XP_SP2_Registry_Backdoor


1. 소개 :

웹 서핑중에 XP_SP2_Registry_Backdoor라는 제목의 흥미로운 글을 보았습니다. 해당 내용은

1. "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Empty" 에
     256자 문자를 초과하는 "문자열 값" 을 생성한 뒤 F5(refresh)를 누르면 해당 문자열이 사라집니다.
2. 이후에 어떠한 "문자열 값", "이진값", "DWORD값" 등 을 생성하여도 F5를(refresh)를 실행하면 해당 값이 사라지게 됩니다.

이러한 현상을 이용하여 registry 정보를 사용자 혹은 관리자로부터 은닉할 수 있습니다.



2. 테스트 내용 :


(1) 레지스트리

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet\Empty 키 값을 생성한 뒤
256 자를 초과하는 임의의 "이름 값"을 생성한뒤 F5 Refesh 수행




(2) F5(Refresh) 이후 "이름 값" 이 사라진 것을 확인할 수 있다.

이 후에 다양한 "문자열 값", "이진값", "DWORD값" 등의 값을 생성한 뒤 F5를 누르면 해당 값이 사라지는 것을 확인
할 수 있다.




[참고] Registry elements 의 size 제한 범위 수치

- key name = 255 문자(Maximum size)
- value name = maximum size
            Windows Server 2003 and Windows XP: 16,383 characters
 Windows 2000: 260 ANSI characters or 16,383 Unicode characters.
            Windows Me/98/95: 255 characters

 

참고 : http://www.hackingdefined.com/index.php/XP_SP2_Registry_Backdoor

Copyright(c) 1998-2008 A3 Security ,LTD


Disclaimer
※ 현재 ㈜에이쓰리시큐리티에서 테스트 및 분석 중에 있으며, 이 문서는 계속 업데이트될 것입니다. 본 문서는 보안취약점으로 인한 피해를 최소화하는 데 도움이 되고자 작성되었으나, 본 문서에 포함된 대응방안의 유효성이나 기타 예상치 못한 시스템의 오작동 발생에 대하여서는 ㈜에이쓰리시큐리티에서는 일체의 책임을 지지 아니합니다.


Sys_call_table Wrapping

(무선)네트워크 2009. 1. 5. 14:45 Posted by 알 수 없는 사용자


▷ 작성자 : minams (minams@a3sc.co.kr)
▷ 편집자 : minams (minams@a3sc.co.kr)

 

Sys_call_table Wrapping

 

목차

1. Introduce
2. Find_sys_call_table for kernel 2.6
3. Test kernel 2.6.22
4. Reference
5. Source code


1. Introduce

kernel 개발 등 여러 가지 작업을 하다 보면 부득이하게 Sys_call_table을 수정해야만 하는 상황이 생긴다.

지금 소개하는 방법은 module을 통해 sys_call_table을 wrapping하는 방법으로 kernel 2.6 이상에서도 가능하며 현재, 2.6.22까지 테스트를 마쳤다.
- Module을 사용하는 이유는 kernel을 컴파일 하지 않고도 wrapping 할 수 있어서이다.



2. Find_sys_call_table for kernel 2.6

잘 알려진 방법으로 sys_call_table 보다 주소가 낮은 공개심볼인 loops_per_jiffy와 높은 주소인 boot_cpu_data 를 이용하여 다음과 같은 코드로 sys_call_table 주소를 찾아낼 수 있다.

 for ( ptr = ( unsigned long )&loops_per_jiffy;
ptr < ( unsigned long )&init_mm ; ptr += sizeof( void* ) )
{
p = ( unsigned long * )ptr; 
if ( p[ 6 ] == ( unsigned long ) sys_close )
{
return (void**)p;
}
}

그러나 이 소스는 kernel 2.6.22 전까지만 유요한 코드이다. 이유는 심볼 주소가 바뀌었기 때문이다. 확인해보자

 

Sys_call_table < Loops_per_jiffy < Boot_cpu_data로 변경 된 것을 알 수 있다.

그리하여 a < sys_call_table < b 를 만족하는 공개심볼을 찾아냈다. 바로 _read_lock와 init_mm이다.
# 주소 확인은 직접 해보자!! /boot/System.map 파일을 열어보면 커널 심볼주소(커널 컴파일시)가 들어있다.

이로 만들어지는 코드는 다음과 같다.

 for ( ptr = ( unsigned long )_read_lock; ptr < ( unsigned long )&init_mm ; ptr += sizeof( void* ) )
{
   p = ( unsigned long * )ptr;
   if ( p[ 6 ] == ( unsigned long ) sys_close )
   {
     return (void**)p;
   }
}

여기서 해결되면 쉽겠지만 문제가 또 하나 발생한다. 이유는 sys_call_table 이 읽기전용으로 바뀐 것이다.

해당 page의 속성을 바꾸기 위해서 다음을 추가하자 해더는 asm/cacheflush.h 이다

 // 쓰기로 변경
change_page_attr(virt_to_page(sys_call_table), 1, PAGE_KERNEL);

// 다음으로 캐시라인 전체를 업데이트
global_flush_tlb();

3. Test kernel 2.6.22

Sys_open을 다음과 같이 간략히 Wrapping

다음과 같은 실수를 하지 않도록 ㅡㅡㅋ


 
 다음은 컴파일 하는 화면이다.
 

 
 다은은 Test 하는 화면입니다.
 

 



4. 참고 사이트 및 문헌

IT EXPORT 리눅스 커널 프로그래밍
http://monac.egloos.com/1308090



5. Source code

 --------minux.c-------------------------------------------------------
#include <linux/kernel.h>

#include <linux/init.h>
#include <linux/syscalls.h>
#include <linux/module.h>
#include <asm/unistd.h>

#include <linux/sched.h>
#include <linux/slab.h>
#include <asm/ptrace.h>
#include <asm/cacheflush.h>

//extern int change_page_attr;
void **sys_call_table;

asmlinkage int (*org_sys_open)(const char*, int, int);
asmlinkage int (*org_sys_getuid)(void);

asmlinkage int minux_sys_open(char *fname, int flags, int mode)
{
        printk( KERN_ALERT "%s file is opened by %d\n",fname,org_sys_getuid() );
        return ( org_sys_open( fname, flags, mode ) );
}

static void **find_system_call_table(void)
{
        unsigned long ptr;
        unsigned long *p;

        for( ptr = (unsigned long)_read_lock; ptr < (unsigned long)&init_mm; ptr
+= sizeof(void*) )
        {
                p = (unsigned long *)ptr;
                if( p[6] == (unsigned long)sys_close )
                {
                        return (void**)p;
                }
        }

        return NULL;
}

int __init minux_init(void)
{
        sys_call_table = find_system_call_table();

        if( sys_call_table != NULL )
        {
                printk( KERN_ALERT "I think sys_call_table is at 0x%p\n", (void*)
sys_call_table );
//
                change_page_attr(virt_to_page(sys_call_table), 1, PAGE_KERNEL);
                global_flush_tlb();
//
                org_sys_open = sys_call_table[__NR_open];
                sys_call_table[__NR_open] = minux_sys_open;

                org_sys_getuid = sys_call_table[__NR_getuid];
        }
        else
        {
                printk( KERN_ALERT "Failed to find_sys_call_table T.T \n");
        }
        return 0;
}

void __exit minux_exit(void)
{
        sys_call_table[__NR_open] = org_sys_open;
}

module_init(minux_init);
module_exit(minux_exit);

MODULE_LICENSE( "GPL" );

-----------Makefile---------------------------------
KERNELDIR = /lib/modules/$(shell uname -r)/build

obj-m = minux.o

KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

clean:
        rm -rf *.o
        rm -rf *.mod.*
        rm -rf .*.cmd
        rm -rf *.ko