# jumpcloud
## 使用方式
```shell=
安裝 ad import 並輸入相關資訊 (很基本不贅述)
打開 ADUC (ServerManger -> Tools -> Active Directory Users and Computers)
在 Users 新增 goup, 名稱為 JumpCloud (注意大小寫)
把要 sync 的 user 加入 JumpCloud 群組 (免費版只能 sync 10 個)
在 Users 按右鍵 -> Delegate Control... -> 把要 sync 的 user 和 JumpCloud 加進去 -> 等待 90s 到來
```
## AD import
```shell=
# break 方式, 檔名可用 strings adint.exe 找尋
b C:/gopath/src/github.com/TheJumpCloud/ADIntegrationAgent/Agent/main.go:40
b *0x6c4824
adint.exe 從 main__main 開始逆會發現它只是在開啟/關閉 adint 服務
我們要逆的是服務
main.(_myservice).Execute
main__myservice__Execute
重點函式
main_mirrorADToJumpCloud
main_getJCGroupsAndUsersFromAD
main_ADDial # ldap 連線
main_getADGroupsAndUsers
main_queryADGroup # (objectClass=*) # powershell 測試方式 get-aduser -LDAPfilter "(objectClass=*)" 可以發現 group 跟 user 都會拿到,但沒有密碼欄位
main_ADGroup_toString # 基本上開啟 debug 就能在 TEMP 看到 (見下方)
main_ADUser_toString
```
## debug
```shell=
# 安裝 x64 dbg
attach adint.exe
b *6a5c90 # main.getADGroupsAndUsers
每 90s 呼叫一次,不想等待可修改 adint.config, 重啟 jumpcloud 服務,再重新 attach
修改 C:\Program Files\JumpCloud AD Bridge\adint.config
"Debug": {
"Debugs": {
"adquery.go": 100,
"debug.go": 100,
"jcmap.go": 100
}
}
查看 C:\Windows\Temp\JumpCloud_AD_Integration
```
```shell=
ADINT:2022/05/13 00:04:13 debug.go:61: adquery.go (main.getADGroupsAndUsers:249): query='CN=JumpCloud;CN=Users;DC=myad;DC=local', len(*userMap)=0
ADINT:2022/05/13 00:04:13 debug.go:61: adquery.go (main.getADGroupsAndUsers:279): Got group from AD: groupName='JumpCloud' - members='CN=test1,CN=Users,DC=myad,DC=local' - users=[]
ADINT:2022/05/13 00:04:13 debug.go:61: adquery.go (main.getADGroupsAndUsers:249): query='CN=test1,CN=Users,DC=myad,DC=local', len(*userMap)=0
ADINT:2022/05/13 00:04:13 debug.go:61: adquery.go (main.getADGroupsAndUsers:264): Got user from AD: userName='test1' - email='kruztw@gmail.com' - given='' - sur='test1' - groups=[] - disabled='false' - isAdmin='false' - expired='true' - passwordExpirationDate=''
ADINT:2022/05/13 00:04:13 debug.go:61: adquery.go (main.populateGroup:447): populateGroup: groupKey = CN=JumpCloud;CN=Users;DC=myad;DC=local, visited = false
ADINT:2022/05/13 00:04:13 debug.go:61: adquery.go (main.populateGroup:462): Adding user 'test1' to group 'CN=JumpCloud;CN=Users;DC=myad;DC=local'
ADINT:2022/05/13 00:04:13 debug.go:61: adquery.go (main.userMapToArray:489): Adding user: userName='test1' - email='kruztw@gmail.com' - given='' - sur='test1' - groups=[JumpCloud] - disabled='false' - isAdmin='false' - expired='true' - passwordExpirationDate=''
ADINT:2022/05/13 00:04:13 debug.go:61: adquery.go (main.groupMapToArray:537): Adding group: groupName='JumpCloud' - members='CN=test1,CN=Users,DC=myad,DC=local' - users=[test1]
ADINT:2022/05/13 00:04:13 debug.go:61: adquery.go (main.buildADStateSignature:614): Adding key string for user: test1|kruztw@gmail.com||test1|false|false|true|
ADINT:2022/05/13 00:04:13 debug.go:61: adquery.go (main.buildADStateSignature:632): Adding key string for group: JumpCloud|test1
ADINT:2022/05/13 00:04:13 debug.go:61: adquery.go (main.buildADStateSignature:638): signature=0211cd1b63519716e3cc3ea63148c18e
ADINT:2022/05/13 00:04:13 adint.go:215: AD change detected, orig='06559caefc3515e4f2bd8262bcece984', new='0211cd1b63519716e3cc3ea63148c18e', hasNewPasswordToSync=true
ADINT:2022/05/13 00:04:16 adint.go:241: This org has Groups support
# main_applyUserChangesToJumpCloud (0x77e2d0)
ADINT:2022/05/13 00:04:19 debug.go:61: jcmap.go (main.applyUserChangesToJumpCloud:575): USER [test1] ACTION = Expired in both AD and JumpCloud
# main_applyUserChangesToJumpCloud (0x6bf848)
ADINT:2022/05/13 00:04:19 debug.go:61: jcmap.go (main.applyUserChangesToJumpCloud:643): user password changed
# main_applyUserChangesToJumpCloud
ADINT:2022/05/13 00:04:19 debug.go:61: jcmap.go (main.applyUserChangesToJumpCloud:656): UPDATE USER: User change occurred on
# 下面這坨資訊在 main_ADUser_toString (0x78DFE7)
'userName='test1' - email='kruztw@gmail.com' - given='' - sur='test1' - groups=[JumpCloud] - isAdmin='false' - expired='false' - suspended='false- passwordExpirationDate='2022-06-23T15:59:11.000Z'', adUser=userName='test1' - email='kruztw@gmail.com' - given='' - sur='test1' - groups=[JumpCloud] - disabled='false' - isAdmin='false' - expired='true' - passwordExpirationDate=''
# main_checkAndSetPasswordChange
ADINT:2022/05/13 00:04:19 debug.go:61: jcmap.go (main.checkAndSetPasswordChange:549): PASSWORD CHANGE for user 'test1'
ADINT:2022/05/13 00:04:21 jcmap.go:678: Could not expire a user 'userName='test1' - email='kruztw@gmail.com' - given='' - sur='test1' - groups=[JumpCloud] - isAdmin='false' - expired='false' - suspended='false- passwordExpirationDate=''' err='ERROR: Could not POST /systemusers/627d25b38dd81735c368e170/expire, err ='ERROR: Could not Unmarshal JSON response, err='invalid character 'O' looking for beginning of value'''
ADINT:2022/05/13 00:04:21 debug.go:61: jcmap.go (main.applyChangesToJumpCloudV2:993): GROUP [JumpCloud] ACTION = In Both AD and JumpCloud
ADINT:2022/05/13 00:04:21 debug.go:61: jcmap.go (main.applyJCGroupChanges:946): UPDATE GROUP (JumpCloud): SKIPPED, NO CHANGES
ADINT:2022/05/13 00:04:21 debug.go:61: jcmap.go (main.applyChangesToJumpCloudV2:993): GROUP [All Users] ACTION = In JumpCloud Only
ADINT:2022/05/13 00:04:21 debug.go:61: jcmap.go (main.applyChangesToJumpCloudV2:1099): GROUP NOP: No changes necessary for group 'All Users'
```
## Q & A
### user 沒 sync 上去
```shell=
因為 email 欄位是空的
```