Original posting

https://gist.github.com/bramtechs/50d724a33d37278d7ca003c6119c8fea

 

Upgrade Debian 9, (current WSL) to Debian 12 (bookworm testing)

Upgrade Debian 9, (current WSL) to Debian 12 (bookworm testing) - upgrade-debian-wsl.md

gist.github.com

 

Just copying contenst for backup. 

  1. Install and open Debian on WSL (if not already)
wsl --install -d debian
wsl -d debian
  1. Go into root
sudo -s
  1. Upgrade Debian 9 to 10
apt update -y && \
apt upgrade -y && \
echo "deb http://deb.debian.org/debian/ buster main
deb http://deb.debian.org/debian/ buster-updates main
deb http://security.debian.org/debian-security buster/updates main" > /etc/apt/sources.list && \
apt update -y && \
apt upgrade -y && \
apt dist-upgrade -y
  1. Upgrade Debian 10 to 11
echo "deb http://deb.debian.org/debian/ bullseye main
deb http://deb.debian.org/debian/ bullseye-updates main" > /etc/apt/sources.list && \
apt update -y && \
apt upgrade -y && \
apt dist-upgrade -y
  1. Debian 11 to 12
echo "deb http://deb.debian.org/debian/ bookworm main
deb http://deb.debian.org/debian/ bookworm-updates main" > /etc/apt/sources.list && \
apt update -y && \
apt upgrade -y && \
apt dist-upgrade -y && \
apt autoremove -y && \
exit

helm 을 설치하기 위해서는 일반적으로 msi 라던지 설치 패키지를 다운받아서 설치할 수 없습니다. 

helm 의 공식 안내페이지(https://helm.sh/docs/intro/install/) 에서는 choco 패키지 관리자나 scoop 패키지 관리자를 이용하여 설치하라고 설명합니다. 

 

choco 는 Chocolatey 라는 패키지 관리 소프트웨어입니다. 이것 또한 설치 방법(https://docs.chocolatey.org/en-us/choco/setup)이 일반적이지 않는데, 파워쉘 스크립트를 이용해야합니다. 하지만 파워쉘 스크립트가 중간에 오류가 나서 제대로 설치가 되지 않고, 익숙하지 않아 msi 버전(https://github.com/chocolatey/choco/releases)으로 설치하였습니다. 

 

choco 를 설치한뒤에는 간단하게 아래 명령어로 설치가 가능합니다. 

choco install kubernetes-helm

 

 

 

 

 

C:\Users\test>choco install kubernetes-helm
Chocolatey v2.2.2
Chocolatey detected you are not running from an elevated command shell
 (cmd/powershell).
 ....
 ....
 Extracting C:\Users\hgchoi\AppData\Local\Temp\chocolatey\kubernetes-helm\3.13.1\helm-v3.13.1-windows-amd64.zip to C:\ProgramData\chocolatey\lib\kubernetes-helm\tools...
C:\ProgramData\chocolatey\lib\kubernetes-helm\tools
 ShimGen has successfully created a shim for helm.exe
 The install of kubernetes-helm was successful.
  Software installed to 'C:\ProgramData\chocolatey\lib\kubernetes-helm\tools'

Chocolatey installed 1/1 packages.
 See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).

C:\Users\test>helm
The Kubernetes package manager

Common actions for Helm:

- helm search:    search for charts
- helm pull:      download a chart to your local directory to view
- helm install:   upload the chart to Kubernetes
- helm list:      list releases of charts
....
....
Use "helm [command] --help" for more information about a command.

C:\Users\test>

...

update-alternatives --install /usr/bin/python python /usr/local/bin/python3.9 10

Ref : https://www.vultr.com/docs/update-python3-on-debian/

 

Update Python 3 on Debian

We are simplifying the cloud. One Login, 16 Countries, 25 Cities, Infinite Possibilities.

www.vultr.com

Ref : https://exitcode0.net/debian-9-how-to-upgrade-python-3-5-to-python-3-7/

 

Debian 9 - How to upgrade python 3.5 to python 3.7

I recently spent 30 minutes figuring out how to upgrade to python 3.7 and subsequently pip version on a fresh install of Debian 9. I ran into a number of issues doing this so I though that I would put this quick post together to make this a little

exitcode0.net

 

기존에 설치된 파이썬의 버전을 리눅스에서 업그레이드 하려면 소스를 받은뒤에 빌드를 해야합니다. 빌드를 하고 설치를 한뒤에 기존 파이썬 명령어를 새 버전으로 바꾸는 작업을 하게 됩니다. 아래 순서대로 진행하면 문제 없이 

 

1. 버전 체크

python3 -V

 

2. 필수 라이브러리 설치

apt-get install wget build-essential libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev liblzma-dev -y

 

3. 소스 다운로드

wget https://www.python.org/ftp/python/3.9.12/Python-3.9.12.tgz

 

4. 적당한위치에 소스 압축파일 풀기

tar xzf Python-3.9.12.tgz

 

5. 압축 해제한 곳에 들어가서 빌드하고 설치하기(빌드 후 설치할때 root 권한 필요)

cd ./Python-3.9.12 
./configure
make
sudo make install

 

6. 기존 명령어를 설치한 버전으로 교체하기(root 권한 필요)

 

sudo update-alternatives --install /usr/bin/python python /usr/local/bin/python3.9 10

Windump 

* 실행파일 하나로 덤프할 수 있다. 

* 실행 방법이 간단하다. 

* 특정 크기/파일 갯수, 연속 캡쳐 및 로테이팅이 가능하다.

* 다양한 옵션으로 필터링을 할 수 있다. tcpdump 랑 같은 옵션을 지원한다.

* winpcap 라이브러리가 필요하다.

 

덤프 방법 - https://www.winpcap.org/windump/docs/manual.htm

1. 패킷 덤프를 뜰 인터페이스를 선택한다. windump.exe -D

2. windump.exe 를 이용하여 패킷을 덤프한다. 

ex) windump.exe -n -i 1 -s 0 -C 10 -W 20 "packetdump_path"

-n : 아이피를 호스트이름으로 바꾸지 않음

-i 1 : 1번 네트워크 인터페이스를 모니터링함

-s 0 : snaplen 의 설정으로 0일 경우 전체 패킷 모니터링함

-C 10 : 10메가 바이트. 이때 메가바이트 단위는 1,000,000. 

-W 20 : 20개의 파일을 로테이션 한다. 기존 파일은 덮어씌운다. 

 

 

netsh

* 별도 라이브러리가 필요없다. 

* 다양한 옵션으로 덤프를 할 수 없다.

* 덤프파일 etl 을 pcapng 로 변환해야한다.

 

덤프 방법

1. 패킷 덤프를 뜰 인터페이스를 선택한다. netsh trace show interfaces

2. netsh trace 를 이용하여 패킷을 덤프한다.

ex) netsh trace start capture=yes CaptureInterface=”Ethernet 3” IPv4.Address=192.168.1.1 tracefile="dump.etl" maxsize=11

 

etl 파일을 pcapng 로 변환하는 방법 - https://github.com/microsoft/etl2pcapng/releases

1. etl2pcapng 를 다운로드 받는다.

2. etl2pcapng.exe 를 실행한다. etl2pcapng.exe source.etl output.pcapng

 

1. nslookup 으로 조회

nslookup

set q=MX

mxdomainname.name

 

2. 웹사이트에서 조회

http://check.mx/mx/

 

자주 사용하는 명령어 정리

 

1. Git을 사용하기 전에 SSH Agent 가 키를 적절하게 로딩해야한다.

 

1.1 SSH Agent 에 로딩된 키 목록 표시

mymacbook:test ggil$ ssh-add -l
4096 SHA256:2Csx/g+iw?????????????8fSPH7Ryfg test@gmail.com (RSA)
mymacbook:test ggil$

 

 

 

1.2 SSH Agent 에 키 등록하기. (기본 id_rsa 가 로딩되나 비밀번호가 반영되어 있으면 이 과정을 거쳐야 한다.)

mymacbook:test ggil$ ssh-add -K ~/.ssh/id_rsa
Enter passphrase for /Users/ggil/.ssh/id_rsa: 
Identity added: /Users/ggil/.ssh/id_rsa (test@gmail.com)
mymacbook:test ggil$ 

 

 

1.3 SSH Agent 에 비밀번호가 등록된 키를 사용할 때, 키체인에 비밀번호를 등록해서 자동으로 등록하기.

https://help.github.com/en/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent#adding-your-ssh-key-to-the-ssh-agent

 

1.3.1 ~/.ssh/config 파일을 편집한다.

macbookpro-01:nsmon hgchoi$ vi ~/.ssh/config

1.3.2 아래와 같이 수정한다. 

Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_rsa

1.3.3 다시 SSH Agent 에 키를 등록한다.

mymacbook:test ggil$ ssh-add -K ~/.ssh/id_rsa
Enter passphrase for /Users/ggil/.ssh/id_rsa: 
Identity added: /Users/ggil/.ssh/id_rsa (test@gmail.com)
mymacbook:test ggil$ 

 

 

2. Git Push

 

2.1 최종 커밋된 로컬 저장소 내용을 리모트 저장소에 반영하기

mymacbook:test ggil$ git push origin master
Warning: Permanently added the ECDSA host key for IP address '1.1.1.1' to the list of known hosts.
Enumerating objects: 42, done.
Counting objects: 100% (42/42), done.
Delta compression using up to 12 threads
Compressing objects: 100% (21/21), done.
Writing objects: 100% (23/23), 12.63 MiB | 6.65 MiB/s, done.
Total 23 (delta 16), reused 0 (delta 0)
To git.test.domain.io:Group1/test.git
   a27a018..dc6e8cb  master -> master
mymacbook:test ggil$ 

 

 

3. Git Branch

 

3.1 Branch 목록 보기

mymacbook:test ggil$ git branch -r
  origin/HEAD -> origin/master
  origin/master
  origin/branch1
  origin/branch2
mymacbook:test ggil$ 

 

 

4. Git Remote

 

4.1 Remote 정보 보기

mymacbook:test ggil$ git remote -v
origin	git@git.test.domain.io:Group1/test.git (fetch)
origin	git@git.test.domain.io:Group1/test.git (push)
mymacbook:test ggil$

 

4.2 Remote 정보 변경하기

mymacbook:test ggil$ git remote set-url origin git@git.test.domain.io:Group1/test.git
mymacbook:test ggil$

바뀐거 확인

mymacbook:test ggil$ git remote -v
origin	git@git.test.domain.io:Group1/test.git (fetch)
origin	git@git.test.domain.io:Group1/test.git (push)
mymacbook:test ggil$

 

 

5. Git pull

 

5.1 original master 원격 저장소를 로컬 저장소에 반영하기

mymacbook:test ggil$ git pull origin master
From ssh://git.test.domain.io:1234/test/test
 * branch            master     -> FETCH_HEAD
Already up to date.
mymacbook:test ggil$ 

 

 

 

 

에러가 나는 상황 및 참고 URL

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed Error

 

 

webconn = (HttpsURLConnection)new URL(uri).openConnection();
webconn.setHostnameVerifier(new HostnameVerifier() {
	@Override
	public boolean verify(String arg0, SSLSession arg1) {
		return true;
	}
});

1. 직접 HttpsURLConnection 를 사용하다 오류난 경우(Self-signed Certification) 위와 같이 코드상에서 간단히 예외처리 가능. 또한 아래 2번 항목으로도 예외처리 가능.

 

 

 

2. 프록시를 이용하는데 proxy 가 Self-signed Certification 을 사용해서 오류난 경우는 1번으로 해결 불가능. 직접 키 스토어에 인증서를 등록한뒤에 해당 키스토어를 신뢰하도록 설정함.

2.1 먼저 proxy 에서 사용중인 Self-signed certification 을 keystore 으로 등록한다.

keytool -import -noprompt -trustcacerts -alias <AliasName> -file   <certificate> -keystore <KeystoreFile> -storepass <Password>

2.2 keystore 파일을 적당한곳에 위치시키고 자바 실행 인자에 아래와 같이 추가한다. 만일 Tomcat의 경우 Tomcat 실행인자를 수정한다.(단 이때 정상적인 HTTPS 도 오류가 날수 있다. 반드시 테스트 후에는 해당 인자를 제거해야 기존 신뢰인증서에 대한 검증을 제대로 수행한다.)

-Djavax.net.ssl.trustStore=<keystore path> -Djavax.net.ssl.trustStorePassword=<keystore password>

 

[Eclipse 에서 Tomcat 실행 환경 변수]

 

 

 

 

 

 


Step by Step guide to Enable HTTPS or SSL correct way on Apache Tomcat Server – Port 8443 

keystore 를 만들어서 Tomcat이 HTTPS 서비스를 할 수 있도록 하기 위한 방법
https://crunchify.com/step-by-step-guide-to-enable-https-or-ssl-correct-way-on-apache-tomcat-server-port-8443/




Create a PKCS12 (.pfx / .p12) from a JKS / JAVA keystore


만들어진 keystore 를 다시 PKCS12 로 변환 하는 방법. 변환한 뒤에 OS의 인증서 관리 툴에서 import 시킨뒤에 trusted로 지정하면 인증서 오류가 사라짐.

https://www.tbs-certificates.co.uk/FAQ/en/627.html



뭔가 신박하고 복잡한 과정이 있는줄 알았다.


하지만 그냥 ISO 를 설치하면 된다. 


6.5 에서 6.7 방법

https://www.youtube.com/watch?v=lZGGTVy9BW8


이걸 참고삼아 설치를 하는데 N54L 은 HPE Custom Image 를 받아서 진행한다. 

6.5까지만 AMD Turion II CPU 를 지원하고 6.7 부터는 각자 알아서 잘 업글 한다는데 거기까진 시간과 노력이 부족하다.



https://www.hpe.com/us/en/servers/hpe-esxi.html


에서 클릭해서 보이지 않으면 제품 검색에 "OEM-ESXI65U2-HPE" 를 입력한다.

https://my.vmware.com/group/vmware/details?downloadGroup=OEM-ESXI65U2-HPE&productId=614


HPE Custom Image for VMware ESXi 6.5 U2 Install CD
실제 파일이름 : VMware-ESXi-6.5.0-Update2-9298722-HPE-Gen9plus-650.U2.10.3.5.5-Sep2018.iso

1. ESXi-6.0.0-20151104001-standard-customized.iso  를 구한다.


2. rufus-3.3p.exe 으로 이미지를 usb 에 복사한다.

2.1 PowerISO 이런걸로 복사했다가 개피봄. 부팅안됨


3. n54l 의 앞 패널쪽 usb 에 꼽는다.

3.1 부팅이 안되면 usb 를 8기가 이하 추천. 16기가에서 성공함. 

3.2 그래도 안되면 usb 를 FAT32 으로 포맷함. 1 단계를 통해서 iso 를 바로 usb 로 구우면 문제 없음.

3.3 그래도 안되면 usb 를 n54l 앞쪽 패널을 열어서 메인보드에 있는 usb 단자에 꼽는다.

3.4 그래도 안되면 https://ubuntuforums.org/showthread.php?t=2282713  참고한다. (별로 도움 안됨)


4. 부팅을 할때 F10 으로 부팅 순서를 체크한다.

4.1 F12 인 네트워크 머시기로 부팅하면 개피봄. 부팅안됨. 

4.2 USB 가 인식이 잘 되었는지 F10 바이오스 세팅 화면에서 USB 관련 세팅을 찾아가면 USB 이름이 보임.


5. 부팅한다. 자동으로 usb 를 인식하여 esxi 설치 화면이 나온다. 


6. 설치 단계를 거치고 난 뒤에 화면에 시스템의 IP 가 표시된다.

6.1 당연히 LAN Cable 을 연결해야하고, DHCP 에 의해서 아이피를 할당받게 된다.


7. http://할당된IP/ 으로 접속하면 vsphere client 를 다운로드 받을 수 있다.

7.1 vmware 홈페이지에서 직접 다운받아도 된다. 6.0 update 3 을 받아도 접속할 수 있지만 약간의 호환성 문제가 있는것 같다. 




1. 지울 이메일을 잘 선정한다. 검색란에 정확하게 기입해서 검색한다.

2. 50개 혹은 100개의 이메일이 나타나는데 왼쪽 전체 선택 체크박스를 누르면 전체 선택이 된다.

3. 이 상태로 지우면 50개 혹은 100개 단위로 삭제할 수 있지만 "검색어와 일치하는 모든대화 선택" 옵션을 선택하면 모두 삭제가 가능하다.



* If there is any build error and it cannot be solved, you should clean folder and retry all process as you planned. 


[OpenSSL 1.1.0e] - succeeded


1. Download OpenSSL latest version (1.1.0e)

2. Install Perl program ( ActiveState Perl recommended )

3. Install NASM (32bit or 64bit) http://www.nasm.us

4. Set path NASM

5. See INSTALL on OpenSSL folder

5.1 Perl Configure ( VC-WIN32 or VC-WIN64A or debug-VC-WIN32 debug-VC-WIN64A ) --prefix=C:\Build-OpenSSL-VC-32-dbg

5.1.1 for avoid license issue "perl Configure debug-VC-WIN32 no-idea no-md2 no-mdc2 no-rc5 no-rc4 enable-capieng no-shared --debug --prefix=c:\Build-OpenSSL-VC-32-dbg"

5.2 nmake

5.3 nmake test

5.4 nmake install <- Need administration privileges. 


[OpenSSL 1.0.2k] - Failed

1. Download OpenSSL latest version (1.0.2k)

2. Install Perl program ( ActiveState Perl recommended )

3. Install NASM (32bit or 64bit) http://www.nasm.us

4. Set path NASM

5. See INSTALL on OpenSSL folder

5.1 Perl Configure ( VC-WIN32 or VC-WIN64A or debug-VC-WIN32 debug-VC-WIN64A ) --prefix=C:\Build-OpenSSL-VC-32-dbg

5.1.1 if there a asm error on nmake, add "no-asm" option. It would be working but it may affect performance lower. 

5.1.2 for avoid license issue "perl Configure debug-VC-WIN32 no-idea no-md2 no-mdc2 no-rc5 no-rc4 enable-capieng no-shared --debug --prefix=c:\Build-OpenSSL-VC-32-dbg"

5.2 ms\do_win64a.bat

5.2.1 For 32bit with nasm, ms\do_nasm.bat

5.2.2 For 32bit with ms, perl Confire no-asm -> ms\do_ms.bat 

5.3 nmake -f ms\nt.mak

5.3.1 if you need to build with DLL, use "nmake -f ms\ntdll.mak"


5.4 See output folder

5.4.1 lib : out32

5.4.2 bin : out32

5.4.3 include : inc32

5.4.4 if the configuration is debug, see out32.dbg


5.5 If you want to test built modules, please do "nmake -f ms\nt.mak test"

5.5.1 it might be failed due to "no-idea". Please ignore. 


5.6 Install modules to --prefix using by "nmake -f ms\nt.mak install"


[Curl]

Place all libs to ../deps/lib (openssl should be named libeay32.lib, ssleay32.lib)

Place all includes to ../deps/include


Set RTLIBCFG=static

!IF "$(RTLIBCFG)"=="static"
RTLIB = /MT
RTLIB_DEBUG = /MTd
!ELSE
RTLIB = /MD
RTLIB_DEBUG = /MDd

!ENDIF 


1. command line build on "~\winbuild\" - Should select command line for machine type

nmake /f Makefile.vc mode=static VC=9 WITH_SSL=static ENABLE_IDN=no DEBUG=no GEN_PDB=yes MACHINE=x64 

1.1 After build without error, please see "~\builds\???"


2. Open "/projects/Windows/VC version/curl-all.sln" by VC++

2.1 Add essential library

2.2 Add CURL_STATICLIB on preprocessor if curl library is static built

2.3 Select build option. 

// 폴더가 존재하는지 체크한다. 없으면 반복적으로 만든다.

p = _tcsrchr(szLogFile, _T('\\'));

*p = _T('\0'); // 임시로 폴더까지만 제한한다.

if ( _access(szLogFile, 00) != 0 )

{

*p = _T('\\'); // 없앴던것을 다시 복구.


// 폴더를 만드는작업을 수행한다.

TCHAR *p1 = _tcschr(szLogFile, _T('\\')); // c:\ 찾음

TCHAR *p2 = _tcschr(p1+1, _T('\\')); // c:\aaa\ 찾음

while(p2 != NULL) 

{

if ( p2 == NULL )

break;


*p2 = _T('\0'); // 임시로 \ 없애고

if ( _access(szLogFile, 00) != 0 ) // 폴더가 있는지 체크한뒤에

{

if ( 0 == CreateDirectory(szLogFile, NULL) ) // 폴더가 없으면 폴더를 만들고

break; // something wrong

}

*p2 = _T('\\'); // 임시로 없앤 \ 를 복구

p1 = p2;

p2 = _tcschr(p1+1, _T('\\'));

}

}

else

*p = _T('\\'); // 없앴던것을 다시 복구


USB로 윈도우 이외의 OS를 설치하다 보면 USB 인식후 접근이 안될때가 있습니다.

접근이 되더라도 용량이 매우 적은 경우가 있는데요.

그럴땐 USB를 초기화해서 사용합니다.


보통은 시작 -> 컴퓨터 관리 -> 디스크관리 에서 파티션을 삭제하게 되는데요.

그런데 간혹 파티션 삭제가 안될때가 있습니다.

그때는 강제로 파티션을 삭제해야하는데 각종 툴들이 있지만 윈도우 기본 툴인 diskpart 를 이용하면 간단하게 삭제가 됩니다.


1. 명령어창을 열어야 하는데 반드시 관리자 권한으로 실행합니다.

2. diskpart 를 명령줄에 입력하고 실행하면 diskpart 가 실행됩니다.

3. list disk 명령으로 물리 디스크 목록을 살펴봅니다.

4. select disk ? 으로 목표로 하는 물리디스크(USB)를 선택합니다.

5. list partition 명령으로 디스크에 등록된 파티션 목록을 살펴봅니다.

6. select partition ? 으로 삭제할 파티션을 선택합니다.

7. delete partition 으로 파티션을 삭제합니다.

5 ~ 7 을 반복해서 모든 파틴션을 삭제합니다.

8. create partition primary 으로 기본 파티션을 생성합니다.

9. exit 명령어로 diskpart 를 종료합니다.

10. 시작 -> 컴퓨터 관리 -> 디스크관리 에서 파티션을 포맷합니다.














1. uncompyle2-master 를 적절한 곳에 위치시킴

2. pythone.exe setup.py install 명령 실행.

3. python.exe ./Script/uncompyle2 ????.pyc > ????.py

[목표]

회사망(192.168.0.0/16, 10.8.0.0/16)에 연결된 피씨에서 외부 VPN을 연결할 경우.

1. 모든 트래픽은 VPN 을 통해서 나가야한다.

2. 회사 중요 시스템에 접근할땐 물리 NIC을 통해서 나가야한다.


[환경]

우선 VPN 에 접속한다. 이때 모든 트래픽을 vpn 을 타고 가도록 설정한다.

c:\>route print

Interface List
 18...?? ?? ?? ?? ?? 69 ......TAP-Windows Adapter V9   <== 요놈이 VPN 게이트웨이 아이피 10.211.1.2
 11...?? ?? ?? ?? ?? b9 ......Realtek PCIe GBE Family Controller  <== 요놈이 물리 NIC 게이트웨이 아이피 192.168.1.1
 23...?? ?? ?? ?? ?? e2 ......VirtualBox Host-Only Ethernet Adapter


[설정방법] - 회사망으로 가는 트래픽을 모조리 물리 NIC의 게이트웨이를 타도록 설정한다.

route add 192.168.0.0 mask 255.255.0.0 192.168.1.1 IF 11

route add 10.8.0.0 mask 255.255.0.0 192.168.1.1 IF 11

...



팀 동생이 공유해준 링크인데 개념정리에 도움이 많이 됩니다.


http://www.pgpi.org/doc/pgpintro/

그림만 따왔습니다.



Figure 1-2. Conventional encryption



Figure 1-3. Public key encryption




Figure 1-4. How PGP encryption works




Figure 1-5. How PGP decryption works





Figure 1-6. Simple digital signatures




Figure 1-7. Secure digital signatures




Figure 1-8. Anatomy of a PGP certificate




Figure 1-9. A PGP certificate





Figure 1-10. An X.509 certificate




Figure 1-12. Hierarchical trust







홈서버의 비밀번호를 변경하고 까먹었습니다. 집에가서 아래 방법으로 고쳐보고 안되면 지우겠습니다.  


http://www.kieranlane.com/2013/09/18/resetting-administrator-password-windows-2012/


  • Boot from the Micrsoft Windows Server 2012 DVD
  • From the Windows Setup menu, click “Next”.
  • Select “Repair your computer”
  • Under Choose and option, click on “Troubleshoot”.
  • Under Advanced options, click “Command Prompt”.
  • At the command prompt, run the following commands:
    d:
    cd windows\system32
    ren Utilman.exe Utilman.exe.old
    copy cmd.exe Utilman.exe
  • Close the command prompt and then click “Continue”.
  • The server should now boot and present the logon screen. Here click Windows Key + U.
  • At the prompt you can now change the password, by typing the following command:
    net user administrator Password123
    This will set the password for the Administrator user to be Password123 (case sensitive).

After that repeat above for cleanup. 


ex) Windump.exe -n -i 3 -C 10 -W 10 -w testdump


-n : name resolve 하지 않기

-i 3 : 인터페이스 3번을 모니터링. windump.exe -D 옵션으로 인터페이스 번호를 확인해야함

-C 10 : 10메가씩 짜르기

-W 10 : 파일 갯수 10개씩 돌아가면서 저장. 마지막꺼 지움.

-w testdump : testdump 파일이름으로 저장. 숫자 0~9 까지 -C 옵션에 따라서 늘어남.


#include <json/writer.h>
#include <json/json.h>

#ifdef _DEBUG
#pragma comment(lib, "json_vc71_libmtd.lib")
#else
#pragma comment(lib, "json_vc71_libmt.lib")
#endif

void pjson(Json::Value& v)
{
    if ( true == v.isArray() )
    {
        for (int i=0, max=v.size(); i<max; i++)
        {
            if ( true == v[i].isObject() )
                pjson(v[i]);
            else
                printf(":%s \n", v[i].asString().c_str());
        }
        return;
    }
    else if ( true == v.isObject() )
    {
        Json::Value::Members members(v.getMemberNames());

        for (Json::Value::Members::iterator it = members.begin(); it != members.end(); ++it)
        {
            printf("%s:", (*it).c_str());
            pjson(v[(*it).c_str()]);
        }
    }
    else
    {
        printf(":%s \n", v.asString().c_str());
        return;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    int nRet = 0;
    char* buffer = 0;
    long size = 0;
    FILE *file = fopen("setting.json", "rb");

    if ( file == 0 )
    {
        printf("Cannot open setting.json file \n");
        return 0;
    }

    fseek(file, 0, SEEK_END);
    size=ftell(file);

    buffer = (char*)malloc(sizeof(char)*size+1);
    rewind( file );
    if ( fread(buffer, sizeof(char), size, file) != size )
    {
        printf("Failed to read json file \n");
    }
    fclose (file);

    Json::Reader reader;
    Json::Value root;
    bool ok = reader.parse(buffer, root);

    free(buffer);

    if ( reader.getFormattedErrorMessages().size() != 0 )
    {
        printf("Read json error : %s \n", reader.getFormattedErrorMessages().c_str());
    }

    if ( reader.getStructuredErrors().size() != 0 )
    {
        for ( int i=0; i<reader.getStructuredErrors().size(); i++)
            printf("Read json error : %s \n", reader.getStructuredErrors()[i].message.c_str());
    }

    unsigned short ui = root["address"]["aaa"].asUInt();
    pjson(root);

    return 0;


1. curl 사이트에서 최신 라이브러리 다운로드. http://curl.haxx.se/


2. 적당한 위치에 압축 해제.


3. {압축해제위치}\projects\Windows\{빌드할 VS 버전 선택}\curl.sln 열기


4. 빌드할 라이브러리 선택해서 빌드. (Multi-threaded 옵션은 직접 수정해야함)


5. {압축해제위치}\build\Win32\{빌드한 VS 버전}\LIB [Debug/Release]\libcurl.lib 을 프로젝트로 복사


6. {압축해제위치}\include 를 프로젝트로 복사


7. 프로젝트 설정에서 include 와 lib 설정


8. 만일 라이브러리 타입이 정적라이브러인 경우 Project Property -> C/C++ -> Preprocessor 에 "CURL_STATICLIB"를 반드시 추가. 하지 않으면 링크 에러남
   error LNK2001: unresolved external symbol __imp__curl_easy_init <- 요런에러


9. ldap 관련 에러가 나면 "#pragma comment(lib, "wldap32.lib")" 라이브러리 링크해야함.

1>libcurld.lib(ldap.obj) : error LNK2019: unresolved external symbol __imp__ldap_unbind_s referenced in function _Curl_ldap
1>libcurld.lib(ldap.obj) : error LNK2019: unresolved external symbol __imp__ldap_msgfree referenced in function _Curl_ldap
1>libcurld.lib(ldap.obj) : error LNK2019: unresolved external symbol __imp__ber_free referenced in function _Curl_ldap
1>libcurld.lib(ldap.obj) : error LNK2019: unresolved external symbol __imp__ldap_memfree referenced in function _Curl_ldap
1>libcurld.lib(ldap.obj) : error LNK2019: unresolved external symbol __imp__ldap_value_free_len referenced in function _Curl_ldap 


10. 여기까지 하니까 빌드 및 동작함.


    CURL *curl;
    CURLcode res;
    char buffer[10];
    curl = curl_easy_init();

    if ( 0 != curl )
    {
        curl_easy_setopt(curl, CURLOPT_URL, "http://www.naver.com");
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        if ( res == 0) {
        }
        else {
        }
    } 




http://tools.arantius.com/tabifier




#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>
#include <atlcomcli.h>

#pragma comment(lib, "wbemuuid.lib")

class EventSink : public IWbemObjectSink
{
    LONG m_lRef;
    bool bDone;

public:
    EventSink() { m_lRef = 0; }
   ~EventSink() { bDone = true; }

    virtual ULONG STDMETHODCALLTYPE AddRef()
	{
		return InterlockedIncrement(&m_lRef);
	}
    virtual ULONG STDMETHODCALLTYPE Release()
	{
		LONG lRef = InterlockedDecrement(&m_lRef);
		if(lRef == 0)
			delete this;
		return lRef;
	}
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv)
	{
		if (riid == IID_IUnknown || riid == IID_IWbemObjectSink)
		{
			*ppv = (IWbemObjectSink *) this;
			AddRef();
			return WBEM_S_NO_ERROR;
		}
		else return E_NOINTERFACE;
	}

    virtual HRESULT STDMETHODCALLTYPE Indicate( 
            LONG lObjectCount,
            IWbemClassObject __RPC_FAR *__RPC_FAR *apObjArray
            )
	{
		HRESULT hres = S_OK;

		for (int i = 0; i < lObjectCount; i++)
		{
			IWbemClassObject *pObj = apObjArray[i];
			_variant_t vtProp;
			// Get the value of the Name property
			// ->GetNames();
			//HRESULT hr = pObj->Get(L"Name", 0, &vtProp, 0, 0);
			HRESULT hr = pObj->Get(_bstr_t(L"TargetInstance"), 0, &vtProp, 0, 0);
			if (!FAILED(hr))
			{
				IUnknown* str = vtProp;
				hr = str->QueryInterface( IID_IWbemClassObject, reinterpret_cast< void** >( &apObjArray[i] ) );
				if ( SUCCEEDED( hr ) )
				{
					_variant_t cn;
					hr = apObjArray[i]->Get( L"Name", 0, &cn, NULL, NULL );
					if ( SUCCEEDED( hr ) )
					{
						if ((cn.vt==VT_NULL) || (cn.vt==VT_EMPTY))
							std::wcout << "Name : " << ((cn.vt==VT_NULL) ? "NULL" : "EMPTY") << endl;
						else
							std::wcout << "Name : " << cn.bstrVal << endl;
					}
					VariantClear(&cn);

					hr = apObjArray[i]->Get( L"ProcessId", 0, &cn, NULL, NULL );
					if ( SUCCEEDED( hr ) )
					{
						if ((cn.vt==VT_NULL) || (cn.vt==VT_EMPTY))
							std::wcout << "PID : " << ((cn.vt==VT_NULL) ? "NULL" : "EMPTY") << endl;
						else if ( cn.vt == VT_I4 )
							std::wcout << "PID : " << cn.intVal << endl;
						else
							std::wcout << "PID : " << cn.bstrVal << endl;
					}
					VariantClear(&cn);
				}
			}
			VariantClear(&vtProp);
		}

		return WBEM_S_NO_ERROR;
	}
        
    virtual HRESULT STDMETHODCALLTYPE SetStatus( 
            /* [in] */ LONG lFlags,
            /* [in] */ HRESULT hResult,
            /* [in] */ BSTR strParam,
            /* [in] */ IWbemClassObject __RPC_FAR *pObjParam
            )
	{
		if(lFlags == WBEM_STATUS_COMPLETE)
		{
			printf("Call complete. hResult = 0x%X\n", hResult);
		}
		else if(lFlags == WBEM_STATUS_PROGRESS)
		{
			printf("Call in progress.\n");
		}

		return WBEM_S_NO_ERROR;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hres;

    // Step 1: --------------------------------------------------
    // Initialize COM. ------------------------------------------

    hres =  CoInitializeEx(0, COINIT_MULTITHREADED); 
    if (FAILED(hres))
    {
        cout << "Failed to initialize COM library. Error code = 0x" 
             << hex << hres << endl;
        return 1;                  // Program has failed.
    }

    // Step 2: --------------------------------------------------
    // Set general COM security levels --------------------------

    hres =  CoInitializeSecurity(
        NULL, 
        -1,                          // COM negotiates service
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities 
        NULL                         // Reserved
        );

                      
    if (FAILED(hres))
    {
        cout << "Failed to initialize security. Error code = 0x" 
             << hex << hres << endl;
        CoUninitialize();
        return 1;                      // Program has failed.
    }
    
    // Step 3: ---------------------------------------------------
    // Obtain the initial locator to WMI -------------------------

    IWbemLocator *pLoc = NULL;

    hres = CoCreateInstance(
        CLSID_WbemLocator,             
        0, 
        CLSCTX_INPROC_SERVER, 
        IID_IWbemLocator, (LPVOID *) &pLoc);
 
    if (FAILED(hres))
    {
        cout << "Failed to create IWbemLocator object. "
             << "Err code = 0x"
             << hex << hres << endl;
        CoUninitialize();
        return 1;                 // Program has failed.
    }

    // Step 4: ---------------------------------------------------
    // Connect to WMI through the IWbemLocator::ConnectServer method

    IWbemServices *pSvc = NULL;
 
    // Connect to the local root\cimv2 namespace
    // and obtain pointer pSvc to make IWbemServices calls.
    hres = pLoc->ConnectServer(
        _bstr_t(L"ROOT\\CIMV2"), 
        NULL,
        NULL, 
        0, 
        NULL, 
        0, 
        0, 
        &pSvc
    );
     
    if (FAILED(hres))
    {
        cout << "Could not connect. Error code = 0x" 
             << hex << hres << endl;
        pLoc->Release();     
        CoUninitialize();
        return 1;                // Program has failed.
    }

    cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;


    // Step 5: --------------------------------------------------
    // Set security levels on the proxy -------------------------

    hres = CoSetProxyBlanket(
        pSvc,                        // Indicates the proxy to set
        RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx 
        RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx 
        NULL,                        // Server principal name 
        RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
        RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
        NULL,                        // client identity
        EOAC_NONE                    // proxy capabilities 
    );

    if (FAILED(hres))
    {
        cout << "Could not set proxy blanket. Error code = 0x" 
             << hex << hres << endl;
        pSvc->Release();
        pLoc->Release();     
        CoUninitialize();
        return 1;               // Program has failed.
    }

    // Step 6: -------------------------------------------------
    // Receive event notifications -----------------------------

    // Use an unsecured apartment for security
    IUnsecuredApartment* pUnsecApp = NULL;

    hres = CoCreateInstance(CLSID_UnsecuredApartment, NULL, 
        CLSCTX_LOCAL_SERVER, IID_IUnsecuredApartment, 
        (void**)&pUnsecApp);
 
    EventSink* pSink = new EventSink;
    pSink->AddRef();

    IUnknown* pStubUnk = NULL; 
    pUnsecApp->CreateObjectStub(pSink, &pStubUnk);

    IWbemObjectSink* pStubSink = NULL;
    pStubUnk->QueryInterface(IID_IWbemObjectSink,
        (void **) &pStubSink);

    // The ExecNotificationQueryAsync method will call
    // The EventQuery::Indicate method when an event occurs
    hres = pSvc->ExecNotificationQueryAsync(
        _bstr_t("WQL"), 
        _bstr_t("SELECT * " 
            "FROM __InstanceCreationEvent WITHIN 1 "
            "WHERE TargetInstance ISA 'Win32_Process'"), 
        WBEM_FLAG_SEND_STATUS, 
        NULL, 
        pStubSink);

    // Check for errors.
    if (FAILED(hres))
    {
        printf("ExecNotificationQueryAsync failed "
            "with = 0x%X\n", hres);
        pSvc->Release();
        pLoc->Release();
        pUnsecApp->Release();
        pStubUnk->Release();
        pSink->Release();
        pStubSink->Release();
        CoUninitialize();    
        return 1;
    }

    // Wait for the event
    Sleep(20000);
         
    hres = pSvc->CancelAsyncCall(pStubSink);

    // Cleanup
    // ========

    pSvc->Release();
    pLoc->Release();
    pUnsecApp->Release();
    pStubUnk->Release();
    pSink->Release();
    pStubSink->Release();
    CoUninitialize();

    return 0;   // Program successfully completed.
}

Rapid7 의 보고서에서 지적질 당한 구버전 SSL 사용을 어떻게 체크해야하는지 난감했는데, 역시나 OWASP 에서 상세히 설명하고 있다.


https://www.owasp.org/index.php/Testing_for_SSL-TLS_(OWASP-CM-001)


1. nessus 로 스캔

2. openssl 으로 특정 SSL 버전을 주고 직접 붙어보기.
 ex: c:\> openssl s_client -no_tls1 -no_ssl3 -connect www.google.com:443 

3. SSLScan 사용하기.
 3.1 http://code.google.com/p/sslscan-win/ 다운로드
 3.2 c:\> SSLScan --no-failed mail.google.com


결과에서 sslV2 중에 약한 암호화 강도 알고리즘을 사용한것만 찾아낸다.

암호화 강도가 약한놈들을 모르겠다면 나처럼 sslv3 랑 tlsv1 만 세팅한다.

 

template <typename T>
    makecmd & operator<<(T const & datum)
    {
      append( boost::lexical_cast<std::string>(datum) );
      return *this;
    }


http://www.codeproject.com/Articles/518159/10-Even-More-Visual-Studio-Debugging-Tips-for-Nati



http://tracert.com/traceroute?t=?.?.?.?



MS 의 소스를 살펴보다가 평소에 알지 못하던 코드가 궁금하여(영어를 이해못했나?) 테스트 해봤습니다. 

    iResult = getaddrinfo(SeverAddress.c_str(), ServerPort, &hints, &result);

    if ( iResult != 0 ) 

{

        printf("getaddrinfo failed with error: %d\n", iResult);

        WSACleanup();

        return 1;

    }

// Attempt to connect to an address until one succeeds

for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) 

{

// Create a SOCKET for connecting to server

        socket_ = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);

        if (socket_ == INVALID_SOCKET)

{

m_dwLastError = WSAGetLastError();

WSACleanup();

return false;

}


// Connect to server.

iResult = ::connect(socket_, ptr->ai_addr, (int)ptr->ai_addrlen);

if (iResult == SOCKET_ERROR) 

{

closesocket(socket_);

socket_ = INVALID_SOCKET;

continue;

}

break;

} 


getaddrinfo 는 어떤식으로 동작할까나? MSDN 의 소스를 실행해보니

http://msdn.microsoft.com/en-us/library/windows/desktop/ms737530(v=vs.85).aspx

Calling getaddrinfo with following parameters: 

       nodename = www.google.com

        servname (or port) = HTTP


getaddrinfo returned success

getaddrinfo response 1

        Flags: 0x0

        Family: AF_INET (IPv4)

        IPv4 address 74.125.224.114

        Socket type: SOCK_STREAM (stream)

        Protocol: IPPROTO_TCP (TCP)

        Length of this sockaddr: 16

        Canonical name: (null)

getaddrinfo response 2

        Flags: 0x0

        Family: AF_INET (IPv4)

        IPv4 address 74.125.224.113

        Socket type: SOCK_STREAM (stream)

        Protocol: IPPROTO_TCP (TCP)

        Length of this sockaddr: 16

        Canonical name: (null)

getaddrinfo response 3

        Flags: 0x0

        Family: AF_INET (IPv4)

        IPv4 address 74.125.224.116

        Socket type: SOCK_STREAM (stream)

        Protocol: IPPROTO_TCP (TCP)

        Length of this sockaddr: 16

        Canonical name: (null)

getaddrinfo response 4

        Flags: 0x0

        Family: AF_INET (IPv4)

        IPv4 address 74.125.224.115

        Socket type: SOCK_STREAM (stream)

        Protocol: IPPROTO_TCP (TCP)

        Length of this sockaddr: 16

        Canonical name: (null)

getaddrinfo response 5

        Flags: 0x0

        Family: AF_INET (IPv4)

        IPv4 address 74.125.224.112

        Socket type: SOCK_STREAM (stream)

        Protocol: IPPROTO_TCP (TCP)

        Length of this sockaddr: 16

        Canonical name: (null)

Press any key to continue . . .


www.google.com 도메인이 지칭하는 아이피 주소들 중에 하나씩 접속을 시도해보기 위한 코드였습니다. 

참고로 www.google.com 의 domain 정보는

C:\>nslookup www.google.com
Server:  hq-dc01-b.nexon.net

Address:  10.1.100.10


Non-authoritative answer:

Name:    www.google.com

Addresses:  2607:f8b0:4005:802::1011

          74.125.224.113

          74.125.224.116

          74.125.224.115

          74.125.224.112

          74.125.224.114



Git 의 설정에서 ssh 클라이언트의 경로가 잘못되어서 발생하는 문제.


TortoiseGit ->Settings -> Network 창 표시

SSH 클라이언트 설정을 

C:\Program Files\TortoiseGit\bin\TortoiseGitPLink.exe

으로 설정.


#include <iostream>
#include <sstream>
int main()
{
    std::cout << "The number 42 in octal:   " << std::oct << 42 << '\n'
              << "The number 42 in decimal: " << std::dec << 42 << '\n'
              << "The number 42 in hex:     " << std::hex << 42 << '\n';
    int n;
    std::istringstream("2A") >> std::hex >> n;
    std::cout << std::dec << "Parsing \"2A\" as hex gives " << n << '\n';
}


+ Recent posts