123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- package main
- import (
- "bufio"
- "bytes"
- "crypto/sha256"
- "crypto/tls"
- "encoding/json"
- "fmt"
- "github.com/dgrijalva/jwt-go"
- "github.com/labstack/echo"
- "golang.org/x/crypto/ssh"
- "io/ioutil"
- "log"
- "net/http"
- "net/url"
- "regexp"
- "strings"
- )
- type handler struct{}
- type userInfo struct {
- Error interface{} `json:"error"`
- ID int `json:"id"`
- Principal string `json:"principal"`
- Result struct {
- Result struct {
- Cn []string `json:"cn"`
- Displayname []string `json:"displayname"`
- Dn string `json:"dn"`
- Gecos []string `json:"gecos"`
- Gidnumber []string `json:"gidnumber"`
- Givenname []string `json:"givenname"`
- HasKeytab bool `json:"has_keytab"`
- HasPassword bool `json:"has_password"`
- Homedirectory []string `json:"homedirectory"`
- Initials []string `json:"initials"`
- Ipauniqueid []string `json:"ipauniqueid"`
- Krbcanonicalname []string `json:"krbcanonicalname"`
- Krbextradata []struct {
- Base64 string `json:"__base64__"`
- } `json:"krbextradata"`
- Krblastfailedauth []struct {
- Datetime string `json:"__datetime__"`
- } `json:"krblastfailedauth"`
- Krblastpwdchange []struct {
- Datetime string `json:"__datetime__"`
- } `json:"krblastpwdchange"`
- Krbloginfailedcount []string `json:"krbloginfailedcount"`
- Krbpasswordexpiration []struct {
- Datetime string `json:"__datetime__"`
- } `json:"krbpasswordexpiration"`
- Krbprincipalname []string `json:"krbprincipalname"`
- Krbpwdpolicyreference []string `json:"krbpwdpolicyreference"`
- Loginshell []string `json:"loginshell"`
- Mail []string `json:"mail"`
- MemberofGroup []string `json:"memberof_group"`
- Mepmanagedentry []string `json:"mepmanagedentry"`
- Mobile []string `json:"mobile"`
- Nsaccountlock bool `json:"nsaccountlock"`
- Objectclass []string `json:"objectclass"`
- Pager []string `json:"pager"`
- Preserved bool `json:"preserved"`
- Sn []string `json:"sn"`
- Telephonenumber []string `json:"telephonenumber"`
- UID []string `json:"uid"`
- Uidnumber []string `json:"uidnumber"`
- } `json:"result"`
- Summary interface{} `json:"summary"`
- Value string `json:"value"`
- } `json:"result"`
- Version string `json:"version"`
- }
- type ServiceList struct {
- TotalCount string `json:"TotalCount,omitempty"`
- ActiveCount string `json:"ActiveCount,omitempty"`
- ActiveVMCount string `json:"ActiveVMCount,omitempty"`
- TotalVMCount string `json:"TotalVMCount,omitempty"`
- }
- type user_findResult struct {
- Error interface{} `json:"error"`
- ID int `json:"id"`
- Principal string `json:"principal"`
- Result struct {
- Count int `json:"count"`
- Result []struct {
- Dn string `json:"dn"`
- Gidnumber []string `json:"gidnumber"`
- Givenname []string `json:"givenname"`
- Homedirectory []string `json:"homedirectory"`
- Krbcanonicalname []string `json:"krbcanonicalname"`
- Krbprincipalname []string `json:"krbprincipalname"`
- Loginshell []string `json:"loginshell"`
- Mail []string `json:"mail"`
- Nsaccountlock bool `json:"nsaccountlock"`
- Sn []string `json:"sn"`
- Telephonenumber []string `json:"telephonenumber"`
- UID []string `json:"uid"`
- Uidnumber []string `json:"uidnumber"`
- } `json:"result"`
- Summary string `json:"summary"`
- Truncated bool `json:"truncated"`
- } `json:"result"`
- Version string `json:"version"`
- }
- var User = userInfo{}
- func (h *handler) login(c echo.Context) error {
- username := c.FormValue("username")
- password := c.FormValue("password")
- _url := URL + "/ipa/session/login_password"
- method := "POST"
- params := url.Values{}
- params.Add("user", username)
- params.Add("password", password)
- payload := strings.NewReader(params.Encode())
- tr := &http.Transport{
- TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
- }
- client := &http.Client{Transport: tr}
- req, err := http.NewRequest(method, _url, payload)
- audit("Recieved Login request from: " + RealIP)
- if err != nil {
- fmt.Println(err)
- }
- req.Header.Add("Referer", URL+"/ipa")
- req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
- req.Header.Add("Accept", "text/plain")
- res, err := client.Do(req)
- cockie := res.Cookies()
- token := cockie[0].Raw
- ba := basicAuth(username, password)
- token = token + "Basic " + ba + ";"
- //fmt.Println("Token:", token)
- defer res.Body.Close()
- fmt.Println(res.StatusCode)
- if res.StatusCode == 200 {
- User = getUserInfo(token, username)
- //fmt.Println(user.Result)
- tokens, err := generateTokenPair(User, token)
- if err != nil {
- return err
- }
- return c.JSON(http.StatusOK, tokens)
- }
- return echo.ErrUnauthorized
- }
- func getUserInfo(token string, username string) userInfo {
- //fmt.Println("Checking for User: ", username)
- url := URL + "/ipa/session/json"
- method := "POST"
- _json := fmt.Sprintf(`
- {
- "method": "user_show",
- "params": [
- [
- "%s"
- ],
- {
- "all": true,
- "version": "2.215"
- }
- ],
- "id": 0
- }
- `, username)
- payload := strings.NewReader(_json)
- tr := &http.Transport{
- TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
- }
- client := &http.Client{Transport: tr}
- req, err := http.NewRequest(method, url, payload)
- //fmt.Println("Request URI: ",req)
- if err != nil {
- fmt.Println(err)
- }
- req.Header.Add("Referer", URL+"/ipa")
- req.Header.Add("Content-Type", "application/json")
- req.Header.Add("Accept", "text/plain")
- req.Header.Add("Cookie", token)
- res, err := client.Do(req)
- body, err := ioutil.ReadAll(res.Body)
- defer res.Body.Close()
- user := userInfo{}
- err = json.Unmarshal(body, &user)
- if err != nil {
- fmt.Println(err)
- }
- //fmt.Println("Getting Data for User: ", user.Result.Result.Uidnumber)
- return user
- }
- func (h *handler) token(c echo.Context) error {
- user := c.Get("user").(*jwt.Token)
- claims := user.Claims.(jwt.MapClaims)
- _sha256 := sha256.Sum256([]byte(string(claims["name"].(string))))
- var hashChannel_ = make(chan []byte, 1)
- hashChannel_ <- _sha256[:]
- token := decrypt(<-hashChannel_, claims["IPAToken"].(string))
- username := claims["name"].(string)
- //fmt.Println("User: ",username)
- //fmt.Println("Token : ",token)
- _user := getUserInfo(token, username)
- //fmt.Println("User: ", _user.Result.Summary)
- newtokens, err := generateTokenPair(_user, token)
- if err != nil {
- return err
- }
- return c.JSON(http.StatusOK, newtokens)
- }
- func IntStringParser(str string) []string {
- re := regexp.MustCompile(`\s{1,}`)
- return strings.Split(re.ReplaceAllString(str, ","), ",")
- }
- func Connect(user, pass, host string, cmd string) bytes.Buffer {
- cipher := ssh.Config{
- Ciphers: []string{"aes128-cbc", "3des-cbc", "aes192-cbc", "aes256-cbc"},
- }
- config := &ssh.ClientConfig{
- User: user,
- Auth: []ssh.AuthMethod{
- ssh.Password(pass),
- },
- HostKeyCallback: ssh.InsecureIgnoreHostKey(),
- Config: cipher,
- }
- conn, err := ssh.Dial("tcp", host, config)
- // time.Sleep(1)
- if err != nil {
- log.Fatal("Failed to dial: ", err)
- }
- sess, err := conn.NewSession()
- if err != nil {
- log.Fatal("Failed to create session: ", err)
- }
- stdin, err := sess.StdinPipe()
- if err != nil {
- log.Fatal("Failed to create session: ", err)
- }
- var bout bytes.Buffer
- var berr bytes.Buffer
- sess.Stdout = &bout
- sess.Stderr = &berr
- sess.Shell()
- fmt.Fprintf(stdin, "%s\n", "terminal length 0")
- fmt.Fprintf(stdin, "%s\n", cmd)
- fmt.Fprintf(stdin, "\nexit\n")
- fmt.Fprintf(stdin, "exit\n")
- sess.Wait()
- sess.Close()
- // scanner := bufio.NewScanner(&bout)
- // for scanner.Scan() {
- // fmt.Println(scanner.Text())
- // }
- // fmt.Println(bout.String())
- return bout
- }
- func (h *handler) findMAC(c echo.Context) error {
- //user := c.Get("user").(*jwt.Token)
- //claims := user.Claims.(jwt.MapClaims)
- //name := claims["name"].(string)
- HOSTNAMEPORT := c.FormValue("HOSTNAMEPORT")
- SERVERURI := c.FormValue("SERVERURI")
- result1 := Connect("rancid", "JDACy6wK*yW%meQ", HOSTNAMEPORT, "sh int status")
- intDesc := SERVERURI
- var IntString string
- scanner := bufio.NewScanner(&result1)
- var IntName string
- var IntMAC string
- // var IntName, IntStatus, IntVLAN, IntDuplex, IntSpeed, IntType string
- for scanner.Scan() {
- if strings.Contains(scanner.Text(), intDesc) {
- IntString = scanner.Text()
- IntName = IntStringParser(IntString)[0]
- break
- }
- }
- result1 = Connect("rancid", "JDACy6wK*yW%meQ", HOSTNAMEPORT, "sh mac address-table int "+IntName)
- scanner = bufio.NewScanner(&result1)
- for scanner.Scan() {
- if strings.Contains(scanner.Text(), IntName) {
- if strings.Contains(scanner.Text(), "mac") {
- continue
- }
- //fmt.Println(scanner.Text())
- IntString = scanner.Text()
- //fmt.Println("len: ", len(IntStringParser(IntString)) )
- if len(IntStringParser(IntString)) < 3 {
- id, code := uuidgen("findMAC")
- resp := _response{
- Origin: "findMAC",
- Message: "",
- Code: code,
- Uuid: id,
- }
- return c.JSON(http.StatusNotFound, resp)
- }
- IntMAC = IntStringParser(IntString)[2]
- }
- }
- //fmt.Println(IntMAC)
- //return c.String(http.StatusOK, "Welcome "+IntMAC+"!")
- id, code := uuidgen("findMAC")
- resp := _response{
- Origin: "findMAC",
- Message: macParser(IntMAC),
- Code: code,
- Uuid: id,
- }
- return c.JSON(http.StatusOK, resp)
- }
- func macParser(str string) string {
- if len(str) < 12 {
- return "ERROR"
- }
- _str := strings.Split(str, ".")
- __str := _str[0] + _str[1] + _str[2]
- ___str := __str[0:2] + ":" + __str[2:4] + ":" + __str[4:6] + ":" + __str[6:8] + ":" + __str[8:10] + ":" + __str[10:12]
- return strings.ToUpper(___str)
- }
|