handler.go 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. package main
  2. import (
  3. "bufio"
  4. "bytes"
  5. "crypto/sha256"
  6. "crypto/tls"
  7. "encoding/json"
  8. "fmt"
  9. "github.com/dgrijalva/jwt-go"
  10. "github.com/labstack/echo"
  11. "golang.org/x/crypto/ssh"
  12. "io/ioutil"
  13. "log"
  14. "net/http"
  15. "net/url"
  16. "regexp"
  17. "strings"
  18. )
  19. type handler struct{}
  20. type userInfo struct {
  21. Error interface{} `json:"error"`
  22. ID int `json:"id"`
  23. Principal string `json:"principal"`
  24. Result struct {
  25. Result struct {
  26. Cn []string `json:"cn"`
  27. Displayname []string `json:"displayname"`
  28. Dn string `json:"dn"`
  29. Gecos []string `json:"gecos"`
  30. Gidnumber []string `json:"gidnumber"`
  31. Givenname []string `json:"givenname"`
  32. HasKeytab bool `json:"has_keytab"`
  33. HasPassword bool `json:"has_password"`
  34. Homedirectory []string `json:"homedirectory"`
  35. Initials []string `json:"initials"`
  36. Ipauniqueid []string `json:"ipauniqueid"`
  37. Krbcanonicalname []string `json:"krbcanonicalname"`
  38. Krbextradata []struct {
  39. Base64 string `json:"__base64__"`
  40. } `json:"krbextradata"`
  41. Krblastfailedauth []struct {
  42. Datetime string `json:"__datetime__"`
  43. } `json:"krblastfailedauth"`
  44. Krblastpwdchange []struct {
  45. Datetime string `json:"__datetime__"`
  46. } `json:"krblastpwdchange"`
  47. Krbloginfailedcount []string `json:"krbloginfailedcount"`
  48. Krbpasswordexpiration []struct {
  49. Datetime string `json:"__datetime__"`
  50. } `json:"krbpasswordexpiration"`
  51. Krbprincipalname []string `json:"krbprincipalname"`
  52. Krbpwdpolicyreference []string `json:"krbpwdpolicyreference"`
  53. Loginshell []string `json:"loginshell"`
  54. Mail []string `json:"mail"`
  55. MemberofGroup []string `json:"memberof_group"`
  56. Mepmanagedentry []string `json:"mepmanagedentry"`
  57. Mobile []string `json:"mobile"`
  58. Nsaccountlock bool `json:"nsaccountlock"`
  59. Objectclass []string `json:"objectclass"`
  60. Pager []string `json:"pager"`
  61. Preserved bool `json:"preserved"`
  62. Sn []string `json:"sn"`
  63. Telephonenumber []string `json:"telephonenumber"`
  64. UID []string `json:"uid"`
  65. Uidnumber []string `json:"uidnumber"`
  66. } `json:"result"`
  67. Summary interface{} `json:"summary"`
  68. Value string `json:"value"`
  69. } `json:"result"`
  70. Version string `json:"version"`
  71. }
  72. type ServiceList struct {
  73. TotalCount string `json:"TotalCount,omitempty"`
  74. ActiveCount string `json:"ActiveCount,omitempty"`
  75. ActiveVMCount string `json:"ActiveVMCount,omitempty"`
  76. TotalVMCount string `json:"TotalVMCount,omitempty"`
  77. }
  78. type user_findResult struct {
  79. Error interface{} `json:"error"`
  80. ID int `json:"id"`
  81. Principal string `json:"principal"`
  82. Result struct {
  83. Count int `json:"count"`
  84. Result []struct {
  85. Dn string `json:"dn"`
  86. Gidnumber []string `json:"gidnumber"`
  87. Givenname []string `json:"givenname"`
  88. Homedirectory []string `json:"homedirectory"`
  89. Krbcanonicalname []string `json:"krbcanonicalname"`
  90. Krbprincipalname []string `json:"krbprincipalname"`
  91. Loginshell []string `json:"loginshell"`
  92. Mail []string `json:"mail"`
  93. Nsaccountlock bool `json:"nsaccountlock"`
  94. Sn []string `json:"sn"`
  95. Telephonenumber []string `json:"telephonenumber"`
  96. UID []string `json:"uid"`
  97. Uidnumber []string `json:"uidnumber"`
  98. } `json:"result"`
  99. Summary string `json:"summary"`
  100. Truncated bool `json:"truncated"`
  101. } `json:"result"`
  102. Version string `json:"version"`
  103. }
  104. var User = userInfo{}
  105. func (h *handler) login(c echo.Context) error {
  106. username := c.FormValue("username")
  107. password := c.FormValue("password")
  108. _url := URL + "/ipa/session/login_password"
  109. method := "POST"
  110. params := url.Values{}
  111. params.Add("user", username)
  112. params.Add("password", password)
  113. payload := strings.NewReader(params.Encode())
  114. tr := &http.Transport{
  115. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  116. }
  117. client := &http.Client{Transport: tr}
  118. req, err := http.NewRequest(method, _url, payload)
  119. audit("Recieved Login request from: " + RealIP)
  120. if err != nil {
  121. fmt.Println(err)
  122. }
  123. req.Header.Add("Referer", URL+"/ipa")
  124. req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
  125. req.Header.Add("Accept", "text/plain")
  126. res, err := client.Do(req)
  127. cockie := res.Cookies()
  128. token := cockie[0].Raw
  129. ba := basicAuth(username, password)
  130. token = token + "Basic " + ba + ";"
  131. //fmt.Println("Token:", token)
  132. defer res.Body.Close()
  133. fmt.Println(res.StatusCode)
  134. if res.StatusCode == 200 {
  135. User = getUserInfo(token, username)
  136. //fmt.Println(user.Result)
  137. tokens, err := generateTokenPair(User, token)
  138. if err != nil {
  139. return err
  140. }
  141. return c.JSON(http.StatusOK, tokens)
  142. }
  143. return echo.ErrUnauthorized
  144. }
  145. func getUserInfo(token string, username string) userInfo {
  146. //fmt.Println("Checking for User: ", username)
  147. url := URL + "/ipa/session/json"
  148. method := "POST"
  149. _json := fmt.Sprintf(`
  150. {
  151. "method": "user_show",
  152. "params": [
  153. [
  154. "%s"
  155. ],
  156. {
  157. "all": true,
  158. "version": "2.215"
  159. }
  160. ],
  161. "id": 0
  162. }
  163. `, username)
  164. payload := strings.NewReader(_json)
  165. tr := &http.Transport{
  166. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  167. }
  168. client := &http.Client{Transport: tr}
  169. req, err := http.NewRequest(method, url, payload)
  170. //fmt.Println("Request URI: ",req)
  171. if err != nil {
  172. fmt.Println(err)
  173. }
  174. req.Header.Add("Referer", URL+"/ipa")
  175. req.Header.Add("Content-Type", "application/json")
  176. req.Header.Add("Accept", "text/plain")
  177. req.Header.Add("Cookie", token)
  178. res, err := client.Do(req)
  179. body, err := ioutil.ReadAll(res.Body)
  180. defer res.Body.Close()
  181. user := userInfo{}
  182. err = json.Unmarshal(body, &user)
  183. if err != nil {
  184. fmt.Println(err)
  185. }
  186. //fmt.Println("Getting Data for User: ", user.Result.Result.Uidnumber)
  187. return user
  188. }
  189. func (h *handler) token(c echo.Context) error {
  190. user := c.Get("user").(*jwt.Token)
  191. claims := user.Claims.(jwt.MapClaims)
  192. _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
  193. var hashChannel_ = make(chan []byte, 1)
  194. hashChannel_ <- _sha256[:]
  195. token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
  196. username := claims["name"].(string)
  197. //fmt.Println("User: ",username)
  198. //fmt.Println("Token : ",token)
  199. _user := getUserInfo(token, username)
  200. //fmt.Println("User: ", _user.Result.Summary)
  201. newtokens, err := generateTokenPair(_user, token)
  202. if err != nil {
  203. return err
  204. }
  205. return c.JSON(http.StatusOK, newtokens)
  206. }
  207. func IntStringParser(str string) []string {
  208. re := regexp.MustCompile(`\s{1,}`)
  209. return strings.Split(re.ReplaceAllString(str, ","), ",")
  210. }
  211. func Connect(user, pass, host string, cmd string) bytes.Buffer {
  212. cipher := ssh.Config{
  213. Ciphers: []string{"aes128-cbc", "3des-cbc", "aes192-cbc", "aes256-cbc"},
  214. }
  215. config := &ssh.ClientConfig{
  216. User: user,
  217. Auth: []ssh.AuthMethod{
  218. ssh.Password(pass),
  219. },
  220. HostKeyCallback: ssh.InsecureIgnoreHostKey(),
  221. Config: cipher,
  222. }
  223. conn, err := ssh.Dial("tcp", host, config)
  224. // time.Sleep(1)
  225. if err != nil {
  226. log.Fatal("Failed to dial: ", err)
  227. }
  228. sess, err := conn.NewSession()
  229. if err != nil {
  230. log.Fatal("Failed to create session: ", err)
  231. }
  232. stdin, err := sess.StdinPipe()
  233. if err != nil {
  234. log.Fatal("Failed to create session: ", err)
  235. }
  236. var bout bytes.Buffer
  237. var berr bytes.Buffer
  238. sess.Stdout = &bout
  239. sess.Stderr = &berr
  240. sess.Shell()
  241. fmt.Fprintf(stdin, "%s\n", "terminal length 0")
  242. fmt.Fprintf(stdin, "%s\n", cmd)
  243. fmt.Fprintf(stdin, "\nexit\n")
  244. fmt.Fprintf(stdin, "exit\n")
  245. sess.Wait()
  246. sess.Close()
  247. // scanner := bufio.NewScanner(&bout)
  248. // for scanner.Scan() {
  249. // fmt.Println(scanner.Text())
  250. // }
  251. // fmt.Println(bout.String())
  252. return bout
  253. }
  254. func (h *handler) findMAC(c echo.Context) error {
  255. //user := c.Get("user").(*jwt.Token)
  256. //claims := user.Claims.(jwt.MapClaims)
  257. //name := claims["name"].(string)
  258. HOSTNAMEPORT := c.FormValue("HOSTNAMEPORT")
  259. SERVERURI := c.FormValue("SERVERURI")
  260. result1 := Connect("rancid", "JDACy6wK*yW%meQ", HOSTNAMEPORT, "sh int status")
  261. intDesc := SERVERURI
  262. var IntString string
  263. scanner := bufio.NewScanner(&result1)
  264. var IntName string
  265. var IntMAC string
  266. // var IntName, IntStatus, IntVLAN, IntDuplex, IntSpeed, IntType string
  267. for scanner.Scan() {
  268. if strings.Contains(scanner.Text(), intDesc) {
  269. IntString = scanner.Text()
  270. IntName = IntStringParser(IntString)[0]
  271. break
  272. }
  273. }
  274. result1 = Connect("rancid", "JDACy6wK*yW%meQ", HOSTNAMEPORT, "sh mac address-table int "+IntName)
  275. scanner = bufio.NewScanner(&result1)
  276. for scanner.Scan() {
  277. if strings.Contains(scanner.Text(), IntName) {
  278. if strings.Contains(scanner.Text(), "mac") {
  279. continue
  280. }
  281. //fmt.Println(scanner.Text())
  282. IntString = scanner.Text()
  283. //fmt.Println("len: ", len(IntStringParser(IntString)) )
  284. if len(IntStringParser(IntString)) < 3 {
  285. id, code := uuidgen("findMAC")
  286. resp := _response{
  287. Origin: "findMAC",
  288. Message: "",
  289. Code: code,
  290. Uuid: id,
  291. }
  292. return c.JSON(http.StatusNotFound, resp)
  293. }
  294. IntMAC = IntStringParser(IntString)[2]
  295. }
  296. }
  297. //fmt.Println(IntMAC)
  298. //return c.String(http.StatusOK, "Welcome "+IntMAC+"!")
  299. id, code := uuidgen("findMAC")
  300. resp := _response{
  301. Origin: "findMAC",
  302. Message: macParser(IntMAC),
  303. Code: code,
  304. Uuid: id,
  305. }
  306. return c.JSON(http.StatusOK, resp)
  307. }
  308. func macParser(str string) string {
  309. if len(str) < 12 {
  310. return "ERROR"
  311. }
  312. _str := strings.Split(str, ".")
  313. __str := _str[0] + _str[1] + _str[2]
  314. ___str := __str[0:2] + ":" + __str[2:4] + ":" + __str[4:6] + ":" + __str[6:8] + ":" + __str[8:10] + ":" + __str[10:12]
  315. return strings.ToUpper(___str)
  316. }